栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Collection.stream()。forEach()和Collection.forEach()有什么区别?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Collection.stream()。forEach()和Collection.forEach()有什么区别?

对于诸如所示的简单情况,它们基本上是相同的。但是,有许多细微的差异可能很重要。

一个问题是订购。使用

Stream.forEach
,顺序不确定。顺序流不太可能发生,但仍可以按
Stream.forEach
任意顺序执行。这确实在并行流中经常发生。相反,如果指定,
Iterable.forEach
则总是以的迭代顺序执行
Iterable

另一个问题是副作用。

Stream.forEach
必须指定中的动作为非干扰动作。(请参阅
java.util.stream
软件包doc。)
Iterable.forEach
可能会有更少的限制。对于中的集合
java.util,Iterable.forEach
通常将使用该集合的
Iterator
,其中大多数被设计为快速失败的,并且
ConcurrentModificationException
如果在迭代过程中对结构进行了修改,则会抛出该集合。但是,在迭代过程中允许进行非结构化的修改。例如,ArrayList类文档说“仅设置元素的值不是结构修改”。因此,针对
ArrayList.forEach
允许在底层中设置值ArrayList而不会出现问题。

并发集合又一次不同。它们不是快速失败,而是设计为弱一致性。完整的定义在该链接上。不过,请简要考虑一下

ConcurrentlinkedDeque
。传递给其
forEach
方法的操作被允许修改底层双端队列,即使在结构上
ConcurrentModificationException
也是如此,并且永远不会抛出该异常。但是,发生的修改在此迭代中可能可见,也可能不可见。(因此保持“弱”一致性。)

如果

Iterable.forEach
正在同步的集合上进行迭代,则仍然可以看到另一个差异。在这样的集合上,
Iterable.forEach
获取一次该集合的锁,并在对action方法的所有调用中保持该锁。该
Stream.forEach
调用使用集合的分隔符,该分隔符不会锁定,并且依赖于不干扰的流行规则。支持该流的集合可以在迭代期间进行修改,如果是,则
ConcurrentModificationException
可能导致行为不一致或行为不一致。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432054.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号