What is difference between Collection.stream().forEach() and Collection.forEach()?
我了解使用
对于诸如所示的简单情况,它们基本上是相同的。但是,有许多细微的差别可能很重要。
一个问题是订购。对于
另一个问题是副作用。
并发集合又一次不同。它们不是快速失败,而是设计为弱一致性。完整定义在该链接上。简要地,请考虑
如果
该答案本身与循环的各种实现的性能有关。它与被称为"非常频繁"的循环(如数百万次调用)的边际相关。在大多数情况下,循环的内容将是迄今为止最昂贵的元素。对于确实经常循环的情况,这可能仍然很有趣。
您应该在目标系统下重复此测试,因为这是特定于实现的(完整的源代码)。
我在快速的Linux机器上运行openjdk版本1.8.0_111。
我编写了一个测试,该测试使用此代码针对
结果如下,最快的方法取决于列表中条目的数量。
但是,即使在最糟糕的情况下,表现最差的人也要花10秒循环10 ^ 5个条目10 ^ 6次,因此实际上在所有情况下其他考虑因素都更为重要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public int outside = 0; private void forCounter(List<Integer> integers) { for(int ii = 0; ii < integers.size(); ii++) { Integer next = integers.get(ii); outside = next*next; } } private void forEach(List<Integer> integers) { for(Integer next : integers) { outside = next * next; } } private void iteratorForEach(List<Integer> integers) { integers.forEach((ii) -> { outside = ii*ii; }); } private void iteratorStream(List<Integer> integers) { integers.stream().forEach((ii) -> { outside = ii*ii; }); } |
这是我的时间安排:毫秒/功能/列表中的条目数。
每次运行为10 ^ 6循环。
1 2 3 4 5 | 1 10 100 1000 10000 for with index 39 112 920 8577 89212 iterator.forEach 27 116 959 8832 88958 for:each 53 171 1262 11164 111005 iterable.stream.forEach 255 324 1030 8519 88419 |
如果您重复实验,我将发布完整的源代码。请编辑此答案,并在结果中加上已测试系统的注释。
使用MacBook Pro,2.5 GHz Intel Core i7、16 GB,macOS 10.12.6:
1 2 3 4 5 | 1 10 100 1000 10000 for with index 49 145 887 7614 81130 iterator.forEach 27 106 1047 8516 88044 for:each 46 143 1182 10548 101925 iterable.stream.forEach 393 397 1108 8908 88361 |
您提到的两者之间没有区别,至少在概念上,
内部的
两种实现都最终对