Java 使用forEach和Stream的利弊
从java 8开始迭代列表,我可以使用以下两种方法:Java 使用forEach和Stream的利弊,java,java-8,java-stream,Java,Java 8,Java Stream,从java 8开始迭代列表,我可以使用以下两种方法: List list = new ArrayList(); 1. list.forEach(...) 2. list.stream().forEach(...) 使用第二种情况有什么好处吗?要将列表转换为流?使用第二种情况没有好处,除非您有一个并行流。有一个缺点,即Stream.forEach()不能保证遵守遭遇顺序。更准确(但仍然不必要)的等价物是Stream.forEachOrdered()不,理论上,第二个选项比第一个选项更糟糕-您需要
List list = new ArrayList();
1. list.forEach(...)
2. list.stream().forEach(...)
使用第二种情况有什么好处吗?要将列表转换为流?使用第二种情况没有好处,除非您有一个并行流。有一个缺点,即
Stream.forEach()
不能保证遵守遭遇顺序。更准确(但仍然不必要)的等价物是Stream.forEachOrdered()
不,理论上,第二个选项比第一个选项更糟糕-您需要支付实例化/垃圾收集和调用Stream
实例的成本,但实际上并没有得到任何回报
此外,理论上,
Stream.forEach()
的迭代顺序是不确定的。forEach的不保证遭遇顺序是否也适用于对源进行排序的非并行流?@tsolakp简单地说,是的。更多信息请参见此处:有人必须编写更好的Javadoc:)。下面是来自Javadoc的代码片段。“如果流被排序,在相同的源上重复执行相同的流管道将产生相同的结果;”@shmosel+1,我只是没有找到正确的词,即使forEach仅通过副作用操作,通过stream()将元素添加到列表中.forEach
被强烈劝阻,它可能会产生错误的结果,而另一个也可以。@Eugene OP从未提到过这样的用法。至于一般的副作用,我将引用文档:少量流操作,例如forEach()
和peek()
,只能通过副作用来操作;使用时应小心。