前言
我为什么说Lambda表达式运行效率低。
先准备一个list:
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add(i);
}
先用Lambda表达式的方式来循环一下这个list:
long lambdaStart = System.currentTimeMillis();
list.forEach(i -> {
// 不用做事情,循环就够了
});
long lambdaEnd = System.currentTimeMillis();
System.out.println("lambda循环运行毫秒数===" + (lambdaEnd - lambdaStart));
运行时间大概为110ms
再用普通方式来循环一下这个list:
long normalStart = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
// 不用做事情,循环就够了
}
long normalEnd = System.currentTimeMillis();
System.out.println("普通循环运行毫秒数===" + (normalEnd - normalStart));
运行时间大概为0ms或1ms
你们没看错,运行时间差别就是这么大,不相信的话大家可以自己去试一下,并且这并不是只有在循环时使用Lambda表达式才会导致运行效率低,而是Lambda表达式在运行时就是会需要额外的时间
,我们继续来分析。
分析
如果我们要研究Lambda表达式,最正确、最直接的方法就是查看它所对应的字节码指令。
使用以下命令查看class文件对应的字节码指令:
javap -v -p Test.class
上述命令解析出来的指令非常多,我这里提取比较重要的部分来给大家分析:
使用Lambda表达式所对应的字节码指令如下:
34: invokestatic #6 // Method java/lang/System.currentTimeMillis:()J
37: lstore_2
38: aload_1
39: invokedynamic #7, 0 // InvokeDynamic #0:accept:()Ljava/util/function/Co