当前位置: 首页 > 知识库问答 >
问题:

在哪些情况下流操作应该是有状态的?

魏宸
2023-03-14

stream包的javaodoc中,在parallelism一节的末尾,我读到:

大多数流操作接受描述用户指定行为的参数,这些参数通常是lambda表达式。为了保持正确的行为,这些行为参数必须是无干扰的,并且在大多数情况下必须是无状态的。

我很难理解这个“在大多数情况下”。在哪些情况下,有状态流操作是可以接受/希望的?

还请注意,试图从行为参数访问可变状态会给您带来一个关于安全性和性能的糟糕选择;[...]最好的方法是完全避免有状态行为参数流操作;通常有一种方法可以重构流管道以避免状态性。

所以,我的问题是:在哪些情况下使用有状态流操作是一个好的实践(而不是使用副作用的方法,如foreach)?

一个相关的问题可能是:为什么有些操作会产生副作用,比如foreach?为了避免在lambda表达式中产生副作用,我最后总是执行一个很好的旧for循环

共有1个答案

东方玉泽
2023-03-14

有状态流lambdas的示例:

  • collect(Collector):Collector根据定义是有状态的,因为它必须收集集合(state)中的所有元素。
  • foreach(Consumer):Consumer根据定义是有状态的,除非它是黑洞(no-op)。
  • peek(Consumer):Consumer根据定义是有状态的,因为如果不将其存储在某个地方(例如log),为什么要peek。

因此,collectorconsumer是两个lambda接口,根据定义它们是有状态的。

 类似资料:
  • 我将guava jar文件添加到类路径中,但我的IDE(eclipse)说: Nullable无法解析为类型 但如果我ctrl+单击Nullable,我会看到蓝色下划线,然后看到下划线:

  • 本文向大家介绍vue边界情况有哪些?相关面试题,主要包含被问及vue边界情况有哪些?时的应答技巧和注意事项,需要的朋友参考一下 @Yanhua67 https://cn.vuejs.org/v2/guide/components-edge-cases.html

  • 本文向大家介绍栈溢出有哪些情况?相关面试题,主要包含被问及栈溢出有哪些情况?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。 2)、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。3)、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。

  • 使用Java 8和lambdas可以很容易地将集合作为流进行迭代,使用并行流也同样容易。文档中的两个示例,第二个使用ParallelStream: 只要我不关心顺序,使用平行会一直是有益的吗?人们会认为在更多的核心上分配工作是更快的。 还有其他考虑吗?什么时候应该使用并行流,什么时候应该使用非并行流? (问这个问题是为了引发关于如何以及何时使用并行流的讨论,而不是因为我认为始终使用它们是一个好主意

  • 问题内容: 该函数将与关联的终结器设置为。 默认情况下会终结哪种对象? 默认情况下终结那些对象会导致哪些意外陷阱? 问题答案: 默认情况下,完成以下对象: os。File:当对象被垃圾回收时,文件自动关闭。 os。流程:完成将释放与流程相关的任何资源。在Unix上,这是空操作。在Windows上,它关闭与进程关联的句柄。 在Windows上,程序包似乎可以自动关闭网络连接。 除了上述对象之外,Go

  • 我一直试图理解和展示Java流如何在引擎盖下实现一种类型的循环融合,从而可以将几个操作融合到一个pass中。 这里的第一个例子是: 具有以下输出(对每一个元素的单一传递融合相当清楚): 所以我的问题是,在调用distinct时,我认为因为它是一个“有状态”的中间操作,所以它不允许在(所有操作的)一次传递过程中单独处理单个元素,这是正确的吗。此外,因为sorted()状态操作需要处理整个输入流以产生