无干扰运算符不显示其内容

时间:2018-09-30 12:26:08

标签: java java-stream

请让我知道偷看操作员不显示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: ");
}

3 个答案:

答案 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();