【发布时间】:2015-09-29 06:49:37
【问题描述】:
使用非并发数据结构源的流的无干扰要求是否意味着我们不能在流管道执行期间更改数据结构的元素的状态(除此之外我们不能改变源数据结构本身)? (问题一)
在关于non-interference的部分,在流包描述中,它说: “对于大多数数据源而言,防止干扰意味着确保在流管道执行过程中完全不修改数据源。”
这段没有提到修改元素的状态?
例如,假设“shapes”是非线程安全的集合(例如ArrayList),下面的代码是否被认为有干扰? (问题2)
shapes.stream()
.filter(s -> s.getColor() == BLUE)
.forEach(s -> s.setColor(RED));
这个例子取自reliable source(至少可以这么说),所以它应该是正确的。
但是,如果我将stream() 更改为parallelStream(),它仍然安全正确吗? (问题3)
另一方面,另一个可靠来源 Naftalin Maurice 的“Mastering Lambdas”清楚地表明,通过管道操作改变元素的状态(值)确实是干扰。从关于不干涉的部分(3.2.3):
“但是流的规则禁止任何线程对流源进行任何修改——包括例如更改元素的值——而不仅仅是管道操作。”
如果书中所说的是正确的,是否意味着我们不能使用 Stream API 来修改元素的状态(使用 forEach),而必须使用常规迭代器(或 for-each,或Iterable.forEach)? (问题4)
【问题讨论】:
标签: java lambda java-8 java-stream