Java 8 Streams peek api

2022-09-01 09:44:20

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

List<String> 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<? super T> action)


答案 1

Javadoc提到了以下内容:

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

peek作为中间操作不会执行任何操作。在应用像 这样的终端操作时,结果会如图所示打印出来。foreach


答案 2

文档 说peek

返回由此流的元素组成的流,并在从生成的流中使用元素时对每个元素执行提供的操作。这是一个中间操作。

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


推荐