Java 8 Stream中间操作-元素处理

标签 java java-8 java-stream element

Java 8 Stream API ,诸如 filtermappeek 等中间操作的描述被提到为

...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 提及的“元素”与代码中单个“元素”的明显处理之间的脱节。

谢谢。

最佳答案

是的,无状态中间操作(例如 filtermap 等)一次处理给定的元素,前者要么将其发送到下一个元素,要么不将其发送到下一个元素。 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/

相关文章:

java - Apache CXF 中未发现加密对象异常

java - 查看java源代码

Java 8/Lambdas/Streams : Subclassing Function<T, R> 导致 andThen() 方法出现问题

Java - java.lang.IllegalStateException : source already consumed or closed

java - 将 Java Stream groupingBy 与映射的键和值一起使用

java - 我对 Java Stream.flatMap 的理解正确吗?

java - 确保字符串具有特定的模式

java - android 读取多个txt文件并整理出来

java - `Java 8 in Action` 提供的demo有错吗?

java - 收集器嵌套分组依据与多个字段