【发布时间】:2017-07-12 08:20:03
【问题描述】:
根据 OCP 书,必须避免有状态操作,否则称为有状态 lambda 表达式。书中提供的定义是“有状态的 lambda 表达式是一个其结果取决于在管道执行期间可能发生变化的任何状态的表达式。”
他们提供了一个示例,其中并行流用于使用 .map() 函数将固定的数字集合添加到同步的 ArrayList 中。
arraylist 中的顺序是完全随机的,这应该让人看到有状态的 lambda 表达式在运行时会产生不可预知的结果。这就是为什么强烈建议在使用并行流时避免有状态操作,以消除任何潜在的数据副作用。
他们没有显示一个无状态的 lambda 表达式来解决相同的问题(将数字添加到同步的数组列表),我仍然不明白使用映射函数填充空的同步数组列表的问题是什么与数据......在管道执行过程中可能会改变的状态究竟是什么?他们指的是 Arraylist 本身吗?就像另一个线程决定将其他数据添加到 ArrayList 时,而 parallelstream 仍在添加数字并因此改变最终结果的过程中?
也许有人可以为我提供一个更好的例子来说明什么是有状态的 lambda 表达式以及为什么应该避免它。那将不胜感激。
谢谢
【问题讨论】:
-
您能否添加代码 sn-p 以便我们确切知道您在说什么用例?
标签: java lambda parallel-processing java-stream