【发布时间】:2016-01-08 14:33:45
【问题描述】:
在javaodoc for the stream package,Parallelism 部分的末尾,我读到:
大多数流操作都接受描述用户指定行为的参数,这些参数通常是 lambda 表达式。为了保持正确的行为,这些行为参数必须是无干扰的,并且在大多数情况下必须是无状态的。
我很难理解这个“在大多数情况下”。在哪些情况下可以接受/需要有状态的流操作?
我的意思是,我知道这是可能的,特别是在使用顺序流时,但同一个 javadoc 明确指出:
除了被明确识别为非确定性的操作,例如
findAny(),流是顺序执行还是并行执行不应改变计算结果。
还有:
另请注意,尝试从行为参数访问可变状态会使您在安全性和性能方面做出错误的选择; [...] 最好的方法是避免有状态的行为参数完全流式操作;通常有一种方法可以重组流管道以避免有状态。
所以,我的问题是:在什么情况下使用有状态的流操作是一个好习惯(而不是通过副作用工作的方法,例如forEach)?
一个相关的问题可能是:为什么会有副作用工作,例如forEach?我总是会做一个很好的旧 for 循环以避免在我的 lambda 表达式中产生副作用。
【问题讨论】:
标签: java java-8 java-stream