我使用peek尝试了以下Java8代码片段。
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
Leelaforeach和peek都接受(Consumer<? super T> action),那么为什么输出是不同的呢?
发布于 2015-04-12 07:53:11
Javadoc提到了以下几点:
中间操作返回一个新流。它们总是很懒;执行一个中间操作(例如filter() )实际上并不执行任何筛选,而是创建一个新流,在遍历时,该流包含与给定谓词匹配的初始流的元素。在执行管道的终端操作之前,管道源的遍历不会开始。
peek是一个中间操作,没有任何作用。在应用像foreach这样的终端操作时,结果确实会如图所示被打印出来。
发布于 2015-04-12 04:43:13
peek的文档显示
返回一个由该流的元素组成的流,另外,在从结果流中消耗元素时,对每个元素执行提供的操作。这是一个中间操作。
因此,您必须对结果流做一些操作,System.out.println才能做任何事情。
发布于 2015-04-12 04:43:24
来自流上用于peek方法的文档:
...additionally在每个元素上执行提供的操作,作为元素从结果流中消耗。
https://stackoverflow.com/questions/29586014
复制相似问题