Java 8 我应该使用流API进行简单迭代吗?

Java 8 我应该使用流API进行简单迭代吗?,java-8,java-stream,Java 8,Java Stream,使用新的流API进行简单迭代有什么好处吗 没有流API: for (Map.Entry<String, String> entry : map.entrySet()) { doSomething(entry); } map.entrySet().stream().forEach((entry) -> { doSomething(entry); }); 代码的长度和可读性大致相同。是否存在任何重要的差异(例如在性能方面)?St

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

没有流API:

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

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

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

根据:

在使用 集合是指集合不是线程安全的,这意味着 如果不引入 线程干扰或内存一致性错误。藏品 框架提供了同步包装器,其中添加了自动 同步到任意集合,使其线程安全。 但是,同步会引入线程争用。你想 避免线程争用,因为它会阻止线程在 平行的聚合操作和并行流使您能够 使用非线程安全集合实现并行性,前提是 在对集合进行操作时,不会对其进行修改。注 这种并行性并不会自动快于执行 连续操作,但如果有足够的数据和 处理器核心。而聚合操作使您能够更轻松地 实现并行性,您仍有责任确定 您的应用程序适合并行处理


您曾询问过Streams,但正如skiwi的评论所指出的,如果迭代很简单且不需要并行性或任何附加逻辑,那么将lambda传递给Map上的
forEach
default方法可能就足够了。假设可以重构
doSomething
以获取单独的键和值参数,而不是
Map.Entry
,则这可以简化为一行:

    map.forEach(MyClass::doSomething);  // if doSomething is a static method

    map.forEach(this::doSomething);     // if doSomething is an instance method

如果流可以使代码更短、更可读,那么应该使用流。所以你的用例本身并不是一个好的例子。但是,如果您要使用
map.forEach
方法本身,那么使用lambdas有一定的意义,但同样,此时您不再使用streams;您可以说
map.entrySet().forEach(…)
,而不需要流。对于单个方法调用,表单
map.entrySet().forEach(context::doSomething)比lambda表达式更可取,因为它实际上更短,可读性更强。因此,如果您有一个现有的方法
doSomething
使用单个条目实例或两个匹配键和值的参数,那么使用
forEach(…)
是有意义的。此外,即使这样编写,也不需要第二个示例中的括号。我认为这样更容易阅读…谢谢大家,我从这三条评论中学到了一些东西。Netbeans突出显示了非流版本,并建议进行更改。我点击enter和Netbeans,然后生成上面的流版本。。。