java - 流的有状态和无状态方法

标签 java java-stream stateless side-effects stateful

在接口(interface) Stream 中:

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

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

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

中间操作可分类为:

有状态

  • 区别()
  • 已排序()
  • 限制(长l)
  • 跳过(长 l)

无状态

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

这是我的两个问题:

  1. 无状态中间方法

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

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

这些规则是否正确?

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

非常感谢!

A.

最佳答案

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

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

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

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

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

关于java - 流的有状态和无状态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54831164/

相关文章:

java - 如何使用流修改 List 内的元素并忽略最后一个元素?

java - 为什么我的无状态 session bean 可以作为有状态 session bean 工作?

apache-nifi - Nifi 1.10.0-使用新的无状态 NiFi 执行引擎和命令行

java - 未在 GAE 应用程序中调用 Spring 拦截器

java - 为什么值类的值是它的 hashCode "not a good idea"?

java - 无法覆盖 Idea 中的默认 Maven 设置

java - 如何在 Android 11 中禁用夜间模式?

java - 为何有效:BigDecimal Sum with Reduce 和 BigDecimal::add

java - 如何在 Java 8 的流过滤器中比较两个日期?

java - 限制和跳过操作在无序时变得无状态