我尝试了以下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)
两者foreach
并peek
接受一个 (Consumer<? super T> action)
为什么输出不同?
Neo*_*Neo 39
该Javadoc中提到了以下几点:
中间操作返回一个新流.他们总是懒惰; 执行诸如filter()之类的中间操作实际上并不执行任何过滤,而是创建一个新流,当遍历时,该流包含与给定谓词匹配的初始流的元素.在执行管道的终端操作之前,不会开始遍历管道源.
peek
作为中间操作什么都不做.在应用终端操作时foreach
,结果会打印出来.
文件peek
说
返回由此流的元素组成的流,此外还在从结果流中消耗元素时对每个元素执行提供的操作.这是一个中间操作.
因此,您必须对生成的流执行某些操作System.out.println
才能执行任何操作.