3 回答
TA贡献1851条经验 获得超3个赞
peek()是不触发流处理管道的中间操作。您应该只有一个终端操作来触发流处理管道。流本质上是惰性的,因此如果没有一个终端操作,它就不会被触发。因此,在您的管道中添加一名终端操作员,看看您需要什么。这是一种方法。
long matchCount = numbers.stream().filter(x -> x >= 5)
.peek(x -> System.out.println("peek at: " + x))
.count();
TA贡献1784条经验 获得超8个赞
引用Stream#peek()的 JavaDoc :
返回一个由该流的元素组成的流,另外在每个元素上执行提供的操作,因为元素从结果流中被消耗。
这是一个中间操作。
中间操作返回一个新的流。他们总是很懒惰;执行诸如 filter() 之类的中间操作实际上并不执行任何过滤,而是创建一个新流,该流在遍历时包含与给定谓词匹配的初始流的元素。管道源的遍历直到管道的终端操作被执行后才开始。
TA贡献1831条经验 获得超10个赞
如上所述,流是惰性的。这意味着没有终止操作就不会开始计算。你可以forEach()在你的例子中使用。替换peek为forEach将开始计算:
List<Integer> numbers = Arrays.asList(0,1,2,3,4,5,6,7,8);
numbers
.stream()
.filter(x -> x >= 5)
.forEach(x-> System.out.print("x: " + x));
添加回答
举报