Java8流peek api

Java8流peek api,java,java-8,Java,Java 8,我用peek尝试了以下Java 8代码片段 List<String> list = Arrays.asList("Bender", "Fry", "Leela"); list.stream().peek(System.out::println); 我看到以下输出peek和foreach调用的代码 Bender Bender Fry Fry Leela Leela foreach和peek都接受了(消费者peek的文档中说 返回一个由该流的元素组成的流,在从结果流中消耗元素时,对每

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

List<String> list = Arrays.asList("Bender", "Fry", "Leela");
list.stream().peek(System.out::println);
我看到以下输出peek和foreach调用的代码

Bender
Bender
Fry
Fry
Leela
Leela

foreach
peek
都接受了
(消费者peek
的文档中说

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

因此,您必须对
System.out.println的结果流执行一些操作,才能执行任何操作。

从文档中获取peek方法:

…在从结果流中消耗元素时,对每个元素执行提供的操作

报告提到以下内容:

中间操作返回一个新的流。它们总是惰性的;执行一个中间操作,如filter()实际上不执行任何筛选,而是创建一个新的流,当遍历该流时,该流包含与给定谓词匹配的初始流元素。直到执行管道的终端操作,才开始遍历管道源


peek
作为一个中间操作没有任何作用。在应用像
foreach
这样的终端操作时,结果会像所看到的那样打印出来。

Java-8中的流是惰性的,另外,如果流中有两个链式操作,那么第二个操作会在第一个操作完成后立即开始处理一个数据元素单元(给定流中有一个终端操作)


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

peek作为一个中间操作没有任何作用-为什么一个调用方法完全没有任何作用?@zeroflagL,它是一个中间方法,这意味着它是懒惰的。它不会做任何事情,除非对它调用一个终端操作,这将导致一些计算待执行的操作。从我目前阅读的内容来看,
peek
在调试某些终端操作时特别有用,并且希望在对其应用终端操作之前了解之前的状态。在这种情况下,您可以使用
peek
打印流的元素。这是一种不同的选择ween无所事事和懒惰。此外,
peek
会立即返回一个新的流,这也不是什么。我的评论(以及最初的问题)更多地是针对其中指定的操作的执行。。。。
Bender
Bender
Fry
Fry
Leela
Leela