Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java iterable.forEach()和iterable.stream().forEach()之间的差异_Java_Lambda_Java 8_Java Stream - Fatal编程技术网

Java iterable.forEach()和iterable.stream().forEach()之间的差异

Java iterable.forEach()和iterable.stream().forEach()之间的差异,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,看起来我可以直接在我的集合上调用list.forEach(a->a.stuff()),而不是list.stream().forEach(a->a.stuff())。什么时候我会使用一个而不是另一个(parallelStream()旁白..)?有一些区别: Iterable.forEach保证按照迭代顺序处理,如果它是为Iterable定义的。(列表的迭代顺序通常有很好的定义。)Stream.forEach没有;必须使用Stream.forEachOrdered Iterable.forEach可

看起来我可以直接在我的集合上调用
list.forEach(a->a.stuff())
,而不是
list.stream().forEach(a->a.stuff())
。什么时候我会使用一个而不是另一个(
parallelStream()
旁白..)?

有一些区别:

Iterable.forEach
保证按照迭代顺序处理,如果它是为Iterable定义的。(列表的迭代顺序通常有很好的定义。)
Stream.forEach
没有;必须使用
Stream.forEachOrdered

Iterable.forEach
可能会对底层数据结构产生副作用。尽管如果在迭代过程中修改集合,许多集合的迭代器将抛出
ConcurrentModificationException
,但一些集合的迭代器明确允许这样做。例如,请参见
CopyOnWriteArrayList
。相反,流操作通常不得干扰流源


如果Iterable是一个同步包装器集合,例如,来自
Collections.synchronizedList()
,则对它的
forEach
调用将在整个迭代过程中保持其锁定。这将防止其他线程在迭代期间修改集合,确保迭代看到集合的一致视图,并防止
ConcurrentModificationException
。(这也将防止其他线程在迭代期间读取集合。)流的情况并非如此。没有什么可以阻止在流操作期间修改集合,如果确实发生了修改,则结果是未定义的。

“阻止其他线程修改它”-或者从中读取,当然?最后一点似乎暗示
Stream.forEach
Iterable.forEach
在允许修改流源方面形成了对比。我怀疑你是否有意暗示这一点!我当然不是有意暗示的!我想我应该澄清最后一点。