流的有状态和无状态方法

时间:2019-02-22 16:19:11

标签: java java-stream stateless side-effects stateful

在Stream界面中:

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

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

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

中间操作可归类为:

有状态

  • distinct()
  • sorted()
  • 极限(长l)
  • 跳过(长号)

无状态

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

这是我的两个问题:

  1. 无状态中间方法

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

    • 如果我调用有状态中间方法+不确定的forEach(),我将获得顺序流的相同结果,但是顺序不同。
    • 如果我调用有状态中间方法+不确定的findAny(),我将获得无法预测的结果。
    • 如果我调用有状态中间方法+正常的终端操作,我将获得顺序流的相同结果。

这些规则正确吗?

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

非常感谢!

A。

1 个答案:

答案 0 :(得分:2)

我想条件1和2都成立。我想添加一些操作。

reduce也是有状态操作的一部分。

forEach是无状态操作的一部分。

请注意,无状态操作会产生副作用,因此会变成有状态。

第三条陈述并不完全正确。如果流是有序的,并且我们并行处理它,则与无状态操作一起使用时,流将保持有序。这就是为什么我们需要在流上调用方法unordered()使其无序并提高效率。