使用新的Stream API进行简单迭代有什么好处吗?
没有Stream API:
for (Map.Entry<String, String> entry : map.entrySet()) {
doSomething(entry);
}
使用Stream API:
map.entrySet().stream().forEach((entry) -> {
doSomething(entry);
});
代码的长度和可读性大致相同。是否有任何重要差异(例如性能)?
答案 0 :(得分:5)
Streams API使并行性更容易实现(尽管您只能看到大型集合的好处)。如果必须在第一个示例中实现并行性,那么代码量将有相当大的差异(而不是将.parallelStream()添加到第二个示例中)
在使用的应用程序中实现并行性的一个难点 集合是集合不是线程安全的,这意味着 多线程无法在不引入的情况下操纵集合 线程干扰或内存一致性错误。收藏品 Framework提供了自动添加的同步包装器 同步到任意集合,使其成为线程安全的。 但是,同步会引入线程争用。你想要 避免线程争用,因为它会阻止线程运行 平行。聚合操作和并行流使您可以 实现与非线程安全集合的并行性 在操作集合时不要修改集合。注意 并行性不会比执行更快 串行操作,尽管如果你有足够的数据和 处理器核心。虽然聚合操作使您更容易 实现并行性,您仍然有责任确定是否 您的应用程序适合并行化。
答案 1 :(得分:3)
你问过Streams,但正如skiwi的评论所指出的那样,如果迭代很简单并且不需要并行性或任何其他逻辑,那么将lambda传递给Map上的forEach
默认方法可能会填补账单。假设doSomething
可以重构为采用单独的键和值args而不是Map.Entry
,这可以简化为一行:
map.forEach(MyClass::doSomething); // if doSomething is a static method
map.forEach(this::doSomething); // if doSomething is an instance method