在 Java 8 Stream API ,诸如 filter
、map
和 peek
等中间操作的描述被提到为
...elements of this stream...
但是,像 filter
这样的流中间操作似乎一次处理并返回一个单独的“元素”。例如,Java 8 stream operations execution order问题(参见输出)和答案。
filter
的API说明为
Returns a stream consisting of the elements of this stream that match the given predicate.
但是,Java 8 stream operations execution order中提到的代码问题似乎一次处理并返回一个单独的元素。请澄清 API 提及的“元素”与代码中单个“元素”的明显处理之间的脱节。
谢谢。
最佳答案
是的,无状态中间操作(例如 filter
、map
等)一次处理给定的元素,前者要么将其发送到下一个元素,要么不将其发送到下一个元素。 stage,其中下一个阶段是流管道中的后续中间操作。后者总是会在调用映射函数后将元素发送到后续操作。
例如:
...
.filter(n -> n % 2 == 0) // retain even numbers
.map(n -> n * n) // square it
...
一次一个元素将通过 filter
操作,如果当前元素满足提供的谓词,则会将其传递给 map
操作。
我认为你理解这部分,但你的困惑是为什么在java文档中这么写:
Returns a stream consisting of the elements of this stream that match the given predicate.
“返回一个流”,因为每个中间操作都会返回一个新流。
“由元素组成”,因为流表示元素序列,并且在大多数情况下,有多个元素通过给定的中间操作。
这听起来像是流存储其元素,但事实并非如此。相反,它们可能存储在某些底层集合中或按需生成。
<小时/>值得注意的是,并非每个中间操作都会一次将一个元素传递到下一阶段。例如,sorted
中间操作会缓冲所有元素,直到看到输入末尾,然后将数据发送到后续阶段。
作为阅读,有一篇精彩的帖子,作者:Brian Goetz关于Streams under the hood 。这确实涉及到有关流的详细信息,并且有一个很好的动画由 Tagir Valeev 提供。展示了如何可视化流。
关于Java 8 Stream中间操作-元素处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49588362/