有状态和无状态的流方法

问题描述 投票:5回答:1

在界面Stream中:

中间操作可分为有状态和无状态。它们会影响并行Stream的结果。

只有两个终端操作是非确定性方法:findAny()和forEach(Consumer)。它们会影响并行Stream的结果。

如果中间无状态操作执行延迟操作,则可能产生副作用。这会影响并行Stream的结果。

中间操作可分类为:

有状态

  • 不同()
  • 排序()
  • 限制(长l)
  • 跳过(长l)

无状态

  • 地图(功能f)
  • flatMap(功能f)
  • 过滤器(谓词p)
  • 偷看(消费者c)

这是我的两个问题:

  1. 无状态中间方法 如果我在并行流+非确定性forEach()上调用无状态中间方法,我将获得顺序流的相同结果,但顺序不同。 如果我在并行流+非确定性findAny()上调用无状态中间方法,我将获得不可预测的结果。 如果我在并行流+普通终端操作上调用无状态中间方法,我将获得顺序流的相同结果。 如果我在并行流上调用无状态中间方法+具有副作用的正常终端操作,我将获得不可预测的结果。
  2. 有状态的中间方法 如果我调用有状态中间方法+非确定性forEach(),我将获得顺序流的相同结果,但顺序不同。 如果我调用有状态的中间方法+非确定性的findAny(),我将得到一个不可预测的结果。 如果我调用有状态中间方法+正常终端操作,我将获得顺序流的相同结果。

这些规则是否正确?

  1. Stream元素的顺序是“遇到顺序”,除非我调用BaseStream方法:unordered()。元素的顺序是否会影响流的结果(存在有状态或无状态方法)?如果有,怎么样?

非常感谢!

一个。

java java-stream stateless side-effects stateful
1个回答
2
投票

我想条件1和2都是正确的。我想添加一些操作。

reduce也是有状态行动的一部分。

forEach是无国籍行动的一部分。

请注意,无状态操作如果产生副作用,可能会变为有状态。

第三种说法并不完全正确。如果订购了一个流并且我们并行处理它,那么当与无状态操作一起使用时,该流将保持有序。这就是为什么我们需要在流上调用方法unordered()以使其无序并提高效率。

© www.soinside.com 2019 - 2024. All rights reserved.