我过去一直以为Lambda表达式只不过Java给匿名内部类所添加的一个语法糖; 直到有一次偶然看到编译后的带有lamdba表达式的Class文件,并没有生成类似于$xxx的class文件。我才意识到上述的认识是错误的;
下面的文件是Brian Goetz
在设计Java8 Lambda表达式时的思考; 里面有提及内部类, method handle, dynamic proxy等方式都是可以实现Lambda表达式的, 但是这些方法各有优劣
http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html
可能不太准确,但是容易理解的描述是,lambda表达式时在当前class内生成了一段方法/Function; 由invokedynamic(JRE7 引入)指令调用,更多细节,徐参考上面引用的文章,这里就不深入研究;
对于我们的影响:
- Lamdba的作用域和AIC是不同的; 下面这段代码可以很方便的看出此点;
int i = 5;
Supplier<Integer> s = ()->{
//cannot compile
int i = 6;
return i;
};
Supplier<Integer> s1 = new Supplier<Integer>() {
@Override
public Integer get() {
int i = 6;
return i;
}
};
- 我觉得可以把lambda表达式理解为一种轻量级AIC;它少了对象的创建所需要的任何开销,它的性能毫无疑问更佳;
- 有些JAD无法反编译带有lambda表达式的class文件;
Parsing .\Status$Direction.class...JavaClassFileParseException: Invalid tag value 0x12
测试Java Decompiler是ok的;
https://github.com/java-decompiler