【发布时间】:2019-07-16 18:55:44
【问题描述】:
在界面 Stream 中:
中间操作可分为有状态和无状态。它们会影响并行流的结果。
只有两个终端操作是非确定性方法:findAny() 和 forEach(Consumer)。它们会影响并行流的结果。
如果执行惰性操作,中间无状态操作可能会产生副作用。这会影响并行 Stream 的结果。
中间操作可分为:
有状态
- distinct()
- 排序()
- 限制(长 l)
- 跳过(长 l)
无状态
- 地图(函数 f)
- flatMap(函数 f)
- 过滤器(谓词 p)
- 偷看(消费者 c)
这是我的两个问题:
-
无状态中间方法
- 如果我在并行流 + 非确定性 forEach() 上调用无状态中间方法,我将获得与顺序流相同的结果,但顺序不同。
- 如果我在并行流上调用无状态中间方法 + 非确定性 findAny(),我将获得不可预知的结果。
- 如果我在并行流+普通终端操作上调用无状态中间方法,我将获得与顺序流相同的结果。
- 如果我在并行流上调用无状态中间方法 + 带有副作用的正常终端操作,我将获得不可预知的结果。
-
有状态的中间方法
- 如果我调用有状态的中间方法 + 非确定性 forEach(),我将获得顺序流的相同结果,但顺序不同。
- 如果我调用有状态的中间方法 + 不确定的 findAny(),我会得到一个不可预知的结果。
- 如果我调用有状态的中间方法 + 正常的终端操作,我将获得与顺序流相同的结果。
这些规则正确吗?
- Stream 元素的顺序是“遇到顺序”,除非我调用 BaseStream 方法:unordered()。元素的顺序是否会影响流的结果(在有状态或无状态方法存在的情况下)?如果是,怎么做?
非常感谢!
一个。
【问题讨论】:
-
有一个很好的文档来断言这些规则 - docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/…
-
你能不问多个问题吗?这会使对您的问题的回答相当宽泛且难以真正理解,并使其他人在未来更难真正寻找您的问题。
标签: java java-stream stateless side-effects stateful