Java与Kotlin的lambda

java的lambda
Java 8 标志性的语法糖就是加入了 lambda 表达式的支持。

java 在一个拥有两个方法(不含默认方法)的接口中,是不可以使用 Lambda 表达式的,当一个接口中只有一个抽象方法,即达成了SAM(Single Abstract Method)条件时,Lambda表达式才可以使用。

Java的匿名内部类无论是否需要捕获外部实例,都会在生成的类中捕获外部类的引用。


脱糖:

即在编译阶段将语法层面一些底层字节码不支持的特性转换成基础的字节码结构,(比如List上的泛型脱糖后在字节码层面实际为Object;
image
Desugaring 的历史可以说是非常精彩,它的目标始终如一:新的语法糖可以运行在所有设备上。

  • Retrolambda

Retrolambda通过JVM的一些机制(premain Agent ASM)在编译期把lambda表达式转换为内部类实现,但会生成类导致方法数增加。

  • Jack编译器

Google在Android SDK 21 (Android N 7.0)发布了新的编译器Jack/Jill来构建Android程序,但是他的实现机制是直接将Java源码转为dalvik字节码,而不是Java字节码。

Jack的推出是为了替代Javac的,Jill的作用是将依赖库.aar或者.jar转换成dex。

但是构建Java语言生态特性花费了大量的时间,比如注解处理器、字节码分析、重写和插桩工具,而且社区中已存在的基于这些基础设施的第三方库也无法平滑的切换到Jack。

Source Code -(Jack&Jill)-> Optmized Dalvik bytecode

  • D8编译器

Jack编译器弃用滞后,Google在Android 3.1引入了d8编译器。

Source Code (.java)
-(JavaC)-> Java bytecode (.class文件)
-(Proguard)-> 优化的(Optmized)Java bytecode
-(D8)-> 优化后的 Dalvik bytecode (.dex)

  • R8(2019)

Source Code
-(Javac)-> Java bytecode
-(R8)-> 优化后的 Dalvik bytecode (.dex)

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注