【发布时间】:2017-02-28 23:07:16
【问题描述】:
Oracle 文档中有几处我无法完全理解:
Operations like forEach and peek are designed for side effects;
他们所说的“设计”是什么意思?这两个人有什么特别之处?我可以编写我的代码,以便任何流 API 方法都可以通过副作用工作。据我所知,这完全取决于我。更重要的是,我通常会使用 peek() 来修改元素的状态,而不是源本身,这不会使其有状态或容易产生副作用。
forEach 的 javadoc 还说:
The behavior of this operation is explicitly nondeterministic.
当他们对 findAny 说同样的话时,我理解这一点,但对于 forEach 有什么不确定性?如果流没有排序,则并行流中的任何操作都不能保证排序。为什么只针对 forEach(和 finAny,但它的含义有点不同)提到了不确定性?
for peek 和 forEach javadoc 还包含:
action may be performed at whatever time and in whatever thread the library chooses
再一次,为什么只有那里?为什么其他操作没有提到它?
【问题讨论】:
-
嗯,其实你的问题有两点回答。对于普通的中间操作,不确定性是无关紧要的,因为它们应该没有副作用并且不干扰。对于
forEach,这是“为副作用而设计的”,不确定性很重要,必须记录在案。 -
如果你想要一个正确的答案,这取决于你。规范明确指出传递给大多数流方法的行为参数是无状态。这意味着,在存在可能影响计算的副作用的情况下,无法保证您得到正确的答案。
-
所以,通过“为副作用而设计”,它们实际上意味着 peek 和 forEach 的实现中有一些东西可以使它们对副作用有弹性,但是其余的功能不能保证相同吗?
标签: java-8 java-stream side-effects