代码
//基础测试代码
public static void main(String[] args) {
int capacity = 10000;
List<Integer> l = new ArrayList<>(capacity);
for (int i = 0; i < capacity; i ++) {
l.add(i);
}
System.out.println("list.size:" + capacity);
Long start2 = System.currentTimeMillis();
for (Integer i : l) {
i = i + 1;
}
System.out.println("for-each:" + (System.currentTimeMillis() - start2));
Long start3 = System.currentTimeMillis();
for (int i = 0; i < l.size(); i++) {
int a = l.get(i);
a = a + 1;
}
System.out.println("fori each:"+(System.currentTimeMillis() - start3));
Long start = System.currentTimeMillis();
l.stream().forEach(i -> i++);
System.out.println("stream.forEach:" + (System.currentTimeMillis() - start));
Long start5 = System.currentTimeMillis();
l.stream().forEachOrdered(i -> i++);
System.out.println("stream.forEachOrder:" + (System.currentTimeMillis() - start5));
Long start1 = System.currentTimeMillis();
l.forEach(i -> i ++);
System.out.println("forEach():" + (System.currentTimeMillis() - start1));
Long start4 = System.currentTimeMillis();
l.parallelStream().forEach(i -> i ++);
System.out.println("parallelStream.forEach:" +(System.currentTimeMillis() - start4));
}
执行结果
执行结果根据不同的数量级,有所不同
一:1w
list.size():10000
for-each:5
fori each:2
stream.forEach:101
stream.forEachOrder:2
forEach():1
parallelStream.forEach:8
二:100w
for-each:11
fori each:8
stream.forEach:102
stream.forEachOrder:10
forEach():9
parallelStream.forEach:44
三:1亿
for-each:470
fori each:92
stream.forEach:189
stream.forEachOrder:106
forEach():102
parallelStream.forEach:95
从三种不同量级的结果可以得出结论
在1w-100w区间,forEach()与for-each执行速率相差很小,stream().forEach的执行速率基本无变化
在1亿数据量级别,forEach()与for-each耗时增加较多,但stream().forEach变化依旧很小,而stream并行流在数据量增加的情况下,性能表现最好。
stream().forEach()与stream().forEachOrder()也有所不同,forEachOrder()速率从1w-1亿执行速度都有明显的优势
该如何选择
除了从执行速度上有所区别外,不同的loop有着不同的效果
如:steam() 序列流能够保证顺序(不确定),而parallerStream则无法保证速率但能够并发执行,但Iterable.forEach()由于使用的是迭代器,因此可以保证顺序。
forEach()与for-each如何选择?
- 转换为中文,整理优缺点
- Can’t use non-final variables 无法使用非最终变量
- Can’t handle check exception 不能处理检查性异常,如果forEach中有检查性异常需要用try-catch
- limited flow-control 有限的流量控制 lambda的return等于for-each中的continue,但没有相当于break的东西。
- Might execute in paraller, 可能有概率是并发执行
来源:
https://stackoverflow.com/questions/16635398/java-8-iterable-foreach-vs-foreach-loop
Stream.forEach与Iterable.forEach()如何选择?
主要还是在速度上的选择与业务
https://stackoverflow.com/questions/23218874/what-is-difference-between-collection-stream-foreach-and-collection-foreach