【问题标题】:stateful and stateless methods of stream流的有状态和无状态方法
【发布时间】:2019-07-16 18:55:44
【问题描述】:

在界面 Stream 中:

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

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

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

中间操作可分为:

有状态

  • distinct()
  • 排序()
  • 限制(长 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】:

我猜条件 1 和 2 都为真。我想添加一些操作。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 2020-05-25
    • 1970-01-01
    • 2015-05-09
    • 2016-04-03
    • 2011-07-16
    • 2020-02-27
    相关资源
    最近更新 更多