Java 8 Streams peek api

我试着看下面的Java 8代码片段。

 List list = Arrays.asList("Bender", "Fry", "Leela"); list.stream().peek(System.out::println); 

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

 list.stream().peek(System.out::println).forEach(System.out::println); 

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

 Bender Bender Fry Fry Leela Leela 

foreachpeek接受了(Consumer action)那么为什么输出会有所不同?

Javadoc提到以下内容:

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

peek是一个中间操作什么都不做。 在应用像foreach这样的终端操作时,结果会打印出来。

peek的文档说

返回由此流的元素组成的流,另外在每个元素上执行提供的操作,因为元素是从结果流中消耗的。 这是一个中间操作。

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

从Stream上的docs for peek方法:

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

Java-8中的流是惰性的,另外,如果流中一个接一个地存在两个链接操作,则第一个操作在第一个完成处理一个数据元素单元时开始(假设有一个终端操作)流)。

这就是为什么你可以看到重复的名字字符串获得输出的原因。