我应该使用Stream API进行简单的迭代吗?

时间:2014-04-24 10:08:24

标签: java-8 java-stream

使用新的Stream API进行简单迭代有什么好处吗?

没有Stream API:

 for (Map.Entry<String, String> entry : map.entrySet()) {
        doSomething(entry);
    }

使用Stream API:

map.entrySet().stream().forEach((entry) -> {
        doSomething(entry);
    });

代码的长度和可读性大致相同。是否有任何重要差异(例如性能)?

2 个答案:

答案 0 :(得分:5)

Streams API使并行性更容易实现(尽管您只能看到大型集合的好处)。如果必须在第一个示例中实现并行性,那么代码量将有相当大的差异(而不是将.parallelStream()添加到第二个示例中)

根据Java Trail on parallelism

  

在使用的应用程序中实现并行性的一个难点   集合是集合不是线程安全的,这意味着   多线程无法在不引入的情况下操纵集合   线程干扰或内存一致性错误。收藏品   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
相关问题