【发布时间】:2018-07-25 13:35:06
【问题描述】:
从 java 8 开始遍历列表我可以同时使用:
List list = new ArrayList();
1. list.forEach(...)
2. list.stream().forEach(...)
使用第二种情况有什么好处吗?要将列表转换为流?
【问题讨论】:
标签: java java-8 java-stream
从 java 8 开始遍历列表我可以同时使用:
List list = new ArrayList();
1. list.forEach(...)
2. list.stream().forEach(...)
使用第二种情况有什么好处吗?要将列表转换为流?
【问题讨论】:
标签: java java-8 java-stream
不,理论上,第二种选择比第一种更糟糕 - 您支付了实例化/垃圾收集的成本并调用了 Stream 实例,但实际上并没有得到任何回报。
此外,理论上Stream.forEach() 的迭代顺序是不确定的。
【讨论】:
除非您有并行流,否则使用第二种情况没有任何优势。有一个缺点,即Stream.forEach() 不保证尊重遇到顺序。 Stream.forEachOrdered() 是更准确(但仍然没有必要)的等价物。
【讨论】:
forEach的不保证遇到顺序是否也适用于有顺序源的非并行流?
stream().forEach 将元素添加到列表中,并且可能会产生错误的结果,而另一个就可以了。
forEach() 和peek(),只能通过副作用进行操作;这些应该小心使用。