Java 非干涉运算符不显示其内容

Java 非干涉运算符不显示其内容,java,java-stream,Java,Java Stream,请告诉我peek操作员没有显示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 >

请告诉我peek操作员没有显示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: ");
}
publicstaticvoidmain(字符串[]args){
//试试溪流
列表编号=数组.asList(0,1,2,3,4,5,6,7,8);
流p=数字
.stream()
.过滤器(x->x>=5)
.peek(x->System.out.print(“peek at:+x”);
系统输出打印(“窥视:”);
}
引用JavaDoc:

返回一个由该流的元素组成的流,在从结果流中消耗元素时,对每个元素执行提供的操作

这是一个中间操作。

有关这方面的更多信息,请参见,但为了完整起见:

中间操作返回一个新的流。他们总是懒惰;执行中间操作(如filter())实际上并不执行任何过滤,而是创建一个新的流,当遍历该流时,该流包含与给定谓词匹配的初始流元素在执行管道的终端操作之前,不会开始遍历管道源。

引用以下文件的JavaDoc:

返回一个由该流的元素组成的流,在从结果流中消耗元素时,对每个元素执行提供的操作

这是一个中间操作。

有关这方面的更多信息,请参见,但为了完整起见:

中间操作返回一个新的流。他们总是懒惰;执行中间操作(如filter())实际上并不执行任何过滤,而是创建一个新的流,当遍历该流时,该流包含与给定谓词匹配的初始流元素在执行管道的终端操作之前,不会开始遍历管道源。


正如上面所说,溪流是懒惰的。这意味着如果没有终止操作,计算将无法启动。您可以在示例中使用
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));
List number=Arrays.asList(0,1,2,3,4,5,6,7,8);
数字
.stream()
.过滤器(x->x>=5)
.forEach(x->System.out.print(“x:+x”);

如上所述,流是惰性的。这意味着如果没有终止操作,计算将无法启动。您可以在示例中使用
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));
List number=Arrays.asList(0,1,2,3,4,5,6,7,8);
数字
.stream()
.过滤器(x->x>=5)
.forEach(x->System.out.print(“x:+x”);
peek()
是一种不会触发流处理管道的中间操作。您应该只有一个终端操作来触发流处理管道。流本身就是惰性的,因此如果没有一个终端操作,它就不会被触发。所以,在管道中添加一个终端操作符,看看您需要什么。这里有一种方法

long matchCount = numbers.stream().filter(x -> x >= 5)
    .peek(x -> System.out.println("peek at: " + x))
    .count();
peek()
是一个不会触发流处理管道的中间操作。您应该只有一个终端操作来触发流处理管道。流本身就是惰性的,因此如果没有一个终端操作,它就不会被触发。所以,在管道中添加一个终端操作符,看看您需要什么。这里有一种方法

long matchCount = numbers.stream().filter(x -> x >= 5)
    .peek(x -> System.out.println("peek at: " + x))
    .count();

因为peek是中间的,而不是终止操作。因此,您需要添加一些终止操作。请阅读差异。@carcigenitate在.peek之后,我第二次添加了.filter..但仍然.peek不打印任何内容,因为peek是中间的,不终止操作。因此,您需要添加一些终止操作。阅读差异。@carcigenitate在.peek之后我添加了.filter第二次..但是仍然.peek没有打印任何内容在.peek之后我添加了.filter第二次..但是仍然.peek没有打印任何内容ting@LetsamrIt这也是一种中间操作。在.peek i第二次添加.filter之后,如果没有诸如
forEach()ting@LetsamrIt这也是一种中间操作。没有诸如
forEach()
collect()
reduce()
之类的终端操作,就无法遍历流。