请让我知道偷看操作员不显示system.out.print的原因吗?
代码:
public static void main(String[] args) {
//try stream.of
List<Integer> numbers = Arrays.asList(0,1,2,3,4,5,6,7,8);
Stream<Integer> p = numbers
.stream()
.filter(x -> x >= 5)
.peek(x-> System.out.print("peek at: " + x));
System.out.print("peek at: ");
}
答案 0 :(得分:1)
引用Stream#peek()的JavaDoc:
返回由该流的元素组成的流,另外,当从结果流中消耗元素时,还会对每个元素执行提供的操作。
这是一个中间操作。
有关此内容的更多信息,请参见in the docs.,但出于完整性考虑:
中间操作返回一个新的流。他们总是很懒惰。执行诸如filter()之类的中间操作实际上并不执行任何过滤,而是创建一个新的流,该新流在遍历时将包含与给定谓词匹配的初始流的元素。 在执行管道的终端操作之前,不会开始遍历管道源。
答案 1 :(得分:1)
如上所述,流是惰性的。这意味着没有终止操作就不会开始计算。您可以在示例中使用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));
答案 2 :(得分:1)
peek()
是一个中间操作,不会触发流处理管道。您应该只有一个终端操作才能触发流处理管道。该流本质上是惰性的,因此没有一个终端操作就不会被触发。因此,在您的管道中添加一个终端操作员即可查看所需内容。这是一种方法。
long matchCount = numbers.stream().filter(x -> x >= 5)
.peek(x -> System.out.println("peek at: " + x))
.count();