Java 8 Streams peek api

Neo*_*Neo 31 java java-8

我尝试了以下Java 8代码片段peek.

List<String> list = Arrays.asList("Bender", "Fry", "Leela");
list.stream().peek(System.out::println);
Run Code Online (Sandbox Code Playgroud)

但是控制台上没有打印出任何内容.如果我这样做:

list.stream().peek(System.out::println).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

我看到以下内容同时输出了peek和foreach调用.

Bender
Bender
Fry
Fry
Leela
Leela
Run Code Online (Sandbox Code Playgroud)

两者foreachpeek接受一个 (Consumer<? super T> action) 为什么输出不同?

Neo*_*Neo 39

Javadoc中提到了以下几点:

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

peek作为中间操作什么都不做.在应用终端操作时foreach,结果会打印出来.

  • 无所事事和懒惰之间有区别.此外,`peek`会立即返回一个新流,这也不是什么. (6认同)
  • @zeroflagL,这是一个中间方法,这意味着它是懒惰的.除非在其上调用终端操作,否则它将不会执行任何操作,这将导致执行某些计算.从我到目前为止所读到的内容来看,`peek`在调试某些终端操作时非常有用,并且想要在终端操作应用之前找出之前的状态.在这种情况下,您可以使用`peek`打印出流的元素. (3认同)

Pau*_*ton 6

文件peek

返回由此流的元素组成的流,此外还在从结果流中消耗元素时对每个元素执行提供的操作.这是一个中间操作.

因此,您必须对生成的流执行某些操作System.out.println才能执行任何操作.


Jam*_*gne 6

Stream for the peek方法的文档:

... 从结果流中消耗元素时,另外对每个元素执行提供的动作.