有状态和无状态的流方法

5
在Stream接口中:
中间操作可分类为有状态和无状态。它们会影响并行流的结果。
只有两个终止操作是不确定性方法:findAny()和forEach(Consumer)。它们会影响并行流的结果。
如果执行惰性操作,中间的无状态操作可能会产生副作用。这会影响并行流的结果。
中间操作可以分类为:
有状态
- distinct() - sorted() - limit (long l) - skip (long l)
无状态
- map (Function f) - flatMap (Function f) - filter (Predicate p) - peek (Consumer c)
以下是我的两个问题:
1. 无状态中间方法 - 如果我在并行流上调用无状态中间方法+不确定性的forEach(),那么我将得到与顺序流相同的结果,但顺序不同。 - 如果我在并行流上调用无状态中间方法+不确定性的findAny(),我将得到一个不可预测的结果。 - 如果我在并行流上调用无状态中间方法+正常终止操作,我将得到与顺序流相同的结果。 - 如果我在并行流上调用无状态中间方法+具有副作用的正常终止操作,我将得到一个不可预测的结果。
2. 有状态中间方法 - 如果我调用有状态的中间方法+不确定性的forEach(),我将得到与顺序流相同的结果,但顺序不同。 - 如果我调用有状态的中间方法+不确定性的findAny(),我将得到一个不可预测的结果。 - 如果我调用有状态的中间方法+正常终止操作,我将得到与顺序流相同的结果。
这些规则是否正确?
除非我调用BaseStream方法:unordered(),否则Stream元素的顺序是“遇到的顺序”。在有状态或无状态方法存在时,元素的顺序是否影响流的结果?如果是,如何影响?
非常感谢!
A.

4
有一个良好的文档来验证这些规则 - https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/package-summary.html - Naman
你能不能不要问多个问题?那会使得对你的问题的回答变得非常广泛和难以跟进,也会让其他人在未来寻找你的问题时更加困难。 - Makoto
1个回答

2
我猜条件1和2都是真的。我想添加一些操作。 reduce也是有状态操作的一部分。 forEach是无状态操作的一部分。
请注意,如果无状态操作创建副作用,它们可以变得有状态。
第三个陈述不完全正确。如果流是有序的并且我们以并行方式处理它,则在使用无状态操作时,流将保持有序。这就是为什么我们需要在流上调用方法unordered()使其无序并提高效率的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接