不干扰 Java 8 流中的确切含义
使用非并发数据结构源流的非干扰要求是否意味着我们无法在执行流管道期间更改数据结构元素的状态(除此之外,我们无法更改源数据结构本身)?(问题1)
在关于非干扰的部分中,在流包描述中,它说:“对于大多数数据源,防止干扰意味着确保在流管道的执行过程中根本不修改数据源。
这段话没有提到修改元素的状态?
例如,假设“shapes”是非线程安全集合(例如),下面的代码是否被视为具有干扰?(问题2)ArrayList
shapes.stream()
.filter(s -> s.getColor() == BLUE)
.forEach(s -> s.setColor(RED));
此示例取自可靠的来源(至少可以说),因此它应该是正确的。但是,如果我改成“是”,它还能安全、正确吗?(问题3)stream()
parallelStream()
另一方面,另一个可靠来源Naftalin Maurice的“掌握Lambdas”清楚地表明,通过管道操作改变元素的状态(值)确实是干扰。从有关不干扰 (3.2.3) 的部分:
“但是流的规则禁止任何线程修改流源 , 例如,包括更改元素的值 , 而不仅仅是管道操作。
如果书中所说的是正确的,这是否意味着我们不能使用Stream API来修改元素的状态(使用),并且必须使用常规迭代器(或for-each,或)来执行此操作?(问题 4)forEach
Iterable.forEach