Collection.stream().forEach() 和 Collection.forEach() 有什么区别?
我知道有了.stream()
,我可以使用类似的链操作.filter()
或使用并行流。但是如果我需要执行小操作(例如,打印列表的元素),它们之间有什么区别?
collection.stream().forEach(System.out::println);
collection.forEach(System.out::println);
-
对于如图所示的简单情况,它们大部分是相同的。但是,存在许多可能很重要的细微差异。
一个问题是订购。使用
Stream.forEach
,顺序 未定义
。顺序流不太可能发生这种情况,但它在规范内Stream.forEach
以任意顺序执行。这在并行流中确实经常发生。相反,如果指定Iterable.forEach
了,则始终以
的迭代顺序执行。Iterable
另一个问题是副作用。中指定的操作
Stream.forEach
必须是 无干扰的 。(请参阅java.util.stream
包文档。)Iterable.forEach
可能具有较少的限制。对于
中的集合java.util
,Iterable.forEach
通常会使用该集合Iterator
,其中大多数都设计为快速失败ConcurrentModificationException
,如果在迭代期间对集合进行了结构修改,则会抛出异常。但是,在迭代期间允许进行非结构性
的修改。 例如,ArrayList
类文档说“仅仅设置元素的值不是结构修改”。因此,行动为ArrayList.forEach
允许在底层证券中设置值ArrayList
而不会出现问题。并发集合再次不同。它们不是快速失败,而是设计为弱一致性。完整的定义在那个链接上。不过,简而言之,考虑
ConcurrentLinkedDeque
.
传递给其forEach
方法 的操作
允许修改底层双端队列,甚至是结构上的,并且ConcurrentModificationException
永远不会被抛出。但是,发生的修改可能在此迭代中可见,也可能不可见。(因此“弱”一致性。)Iterable.forEach
如果对同步集合进行迭代,则还有另一个区别是可见的。在这样的集合上,Iterable.forEach
获取集合的锁一次,并在对操作方法的所有调用中保持它。该Stream.forEach
调用使用集合的分离器,它不锁定,并且依赖于不干涉的普遍规则。支持流的集合可以在迭代期间修改,如果是,ConcurrentModificationException
可能会导致行为或不一致的行为。
-
Collection.stream()。forEach()和Collection.forEach()有什么区别?
2021-02-02 关注 0 浏览117 1答案
-
Collection 和Collection有什么区别
2021-01-30 关注 0 浏览112 1答案
-
使用Collection.stream按特定属性动态分组
2021-01-30 关注 0 浏览71 1答案
-
Collection 和 Collections 有什么区别?
2020-01-08 关注 0 浏览1109 1答案
-
map和forEach有什么区别?
2021-01-11 关注 0 浏览200 0答案
-
Collection和Collections有什么区别
2021-12-25 关注 0 浏览75 1答案
-
Collection 和 Collections 有什么区别?
2021-09-18 关注 0 浏览119 1答案
-
Collection 和 Collections 有什么区别?
2021-09-17 关注 0 浏览177 1答案
-
Java中的Collection和List有什么区别?
2021-01-30 关注 0 浏览96 1答案
-
Collection 和 Collections 有什么区别?
2021-09-18 关注 0 浏览180 1答案