D.4 代码生成策略
将Lambda表达式的代码体填入到运行时动态创建的静态方法,就完成了Lambda表达式的字节码转换。无状态Lambda在它涵盖的范围内不保持任何状态信息,就像在代码清单D-2中定义的那样,字节码转换时它是所有Lambda中最简单的一种类型。这种情况下,编译器可以生成一个方法,此方法含有该Lambda表达式同样的签名,所以最终转换的结果从逻辑上看起来就像下面这样:
public class Lambda {Function<Object, String> f = [dynamic invocation of lambda$1]static String lambda$1(Object obj) {return obj.toString();}}
Lambda表达式中包含了final(或者效果上等同于final)的本地变量或者字段的情况会稍微复杂一些,就像下面的这个例子:
public class Lambda {String header = "This is a ";Function<Object, String> f = obj -> header + obj.toString();}
这个例子中,生成方法的签名不会和Lambda表达式一样,因为它还需要携带参数来传递上下文中额外的状态。为了实现这一目标,最简单的方案是在Lambda表达式中为每一个需要额外保存的变量预留参数,所以实现前面Lambda表达式的生成方法会像下面这样:
public class Lambda {String header = "This is a ";Function<Object, String> f = [dynamic invocation of lambda$1]static String lambda$1(String header, Object obj) {return obj -> header + obj.toString();}}
更多关于Lambda表达式转换流程的内容,可以访问如下地址:http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html。
