D.4 代码生成策略

将Lambda表达式的代码体填入到运行时动态创建的静态方法,就完成了Lambda表达式的字节码转换。无状态Lambda在它涵盖的范围内不保持任何状态信息,就像在代码清单D-2中定义的那样,字节码转换时它是所有Lambda中最简单的一种类型。这种情况下,编译器可以生成一个方法,此方法含有该Lambda表达式同样的签名,所以最终转换的结果从逻辑上看起来就像下面这样:

  1. public class Lambda {
  2. Function<Object, String> f = [dynamic invocation of lambda$1]
  3. static String lambda$1(Object obj) {
  4. return obj.toString();
  5. }
  6. }

Lambda表达式中包含了final(或者效果上等同于final)的本地变量或者字段的情况会稍微复杂一些,就像下面的这个例子:

  1. public class Lambda {
  2. String header = "This is a ";
  3. Function<Object, String> f = obj -> header + obj.toString();
  4. }

这个例子中,生成方法的签名不会和Lambda表达式一样,因为它还需要携带参数来传递上下文中额外的状态。为了实现这一目标,最简单的方案是在Lambda表达式中为每一个需要额外保存的变量预留参数,所以实现前面Lambda表达式的生成方法会像下面这样:

  1. public class Lambda {
  2. String header = "This is a ";
  3. Function<Object, String> f = [dynamic invocation of lambda$1]
  4. static String lambda$1(String header, Object obj) {
  5. return obj -> header + obj.toString();
  6. }
  7. }

更多关于Lambda表达式转换流程的内容,可以访问如下地址:http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html