主要观点:介绍了 lambda 和匿名内部类(AIC)的差异及它们的工作原理。
关键信息:
- lambda 实现功能接口,匿名内部类可扩展类或实现任意数量方法的接口。
- 变量方面,lambda 只能访问 final 或有效 final 的变量,匿名内部类可使用实例变量有状态。
- 作用域上,lambda 不能定义与封闭作用域中变量同名的变量。
- 编译时,匿名内部类编译为类,lambda 是
invokedynamic指令。 - lambda 实现的关键是 Java 7 引入的 InvokeDynamic 指令,通过它生成调用站点并使用 lambda 工厂返回功能实现,lambda 转换为要由 InvokeDynamic 调用的方法,该方法存储在类中为私有静态方法。
- 非捕获 lambda 不访问体外字段,捕获 lambda 可访问体外 final 或有效 final 字段。
重要细节: - 编译器为每个匿名内部类生成类文件,如 AnonymousInnerClass$1.class,启动时需加载和验证。
- 以非捕获 lambda 和捕获 lambda 为例展示代码及编译后的类文件内容,如非捕获 lambda 的
NonCapturingLambda类和捕获 lambda 的CapturingLambda类,通过 CFR decompiler 查看其内部结构和 lambda 转换后的方法签名变化等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。