Java中的lambda表达式:实现函数式接口的字节码生成与性能影响

好的,让我们开始吧。

Java Lambda 表达式:实现、字节码生成与性能影响

大家好,今天我们要深入探讨 Java Lambda 表达式,涵盖其实现机制、字节码生成方式以及对程序性能的影响。 Lambda 表达式是 Java 8 引入的关键特性,它显著提升了代码的简洁性和可读性,并为函数式编程范式在 Java 中提供了强大的支持。

1. Lambda 表达式的基本概念与语法

Lambda 表达式本质上是一个匿名函数,它可以作为参数传递给方法或存储在变量中。它提供了一种简洁的方式来表示只包含一个方法定义的接口的实例,即函数式接口。

1.1 函数式接口

函数式接口是指只包含一个抽象方法的接口。Java 8 引入了 @FunctionalInterface 注解,用于显式声明一个接口为函数式接口。虽然不是强制性的,但建议使用此注解,编译器会帮助检查接口是否符合函数式接口的定义。

@FunctionalInterface
interface MyFunctionalInterface {
    int calculate(int a, int b);
}

1.2 Lambda 表达式的语法结构

Lambda 表达式的语法形式如下:

(parameters) -> expression
或
(parameters) -> { statements; }
  • parameters: 参数列表,可以为空,也可以包含一个或多个参数。参数类型可以显式声明,也可以由编译器自动推断。
  • ->: 箭头符号,用于分隔参数列表和 Lambda 表达式体。
  • expression: 表达式,当 Lambda 表达式体只包含一个表达式时,可以直接使用表达式。
  • { statements; }: 语句块,当 Lambda 表达式体包含多条语句时,需要使用花括号括起来。

1.3 Lambda 表达式示例

// 无参数的 Lambda 表达式
Runnable runnable = () -> System.out.println("Hello, Lambda!");

// 接受一个参数的 Lambda 表达式
MyFunctionalInterface square = (x) -> x * x;

// 接受两个参数的 Lambda 表达式,显式指定参数类型
MyFunctionalInterface sum = (int a, int b) -> a + b;

// 包含多条语句的 Lambda 表达式
MyFunctionalInterface complicatedCalculation = (a, b) -> {
    int result = a * 2 + b / 3;
    return result;
};

2. Lambda 表达式的实现机制

Java Lambda 表达式的实现并非简单地将其转换为匿名内部类。如果直接转换为匿名内部类,每次调用 Lambda 表达式都会创建一个新的对象,这会带来显著的性能开销。Java 采用了不同的策略来优化 Lambda 表达式的实现。

2.1 方法句柄 (Method Handles)

Java 7 引入了方法句柄 (Method Handles) API,它是一种更加动态和灵活的方式来表示方法引用。 Lambda 表达式的实现通常基于方法句柄。方法句柄允许在运行时动态地调用方法,而无需在编译时确定方法的具体类型。

2.2 invokedynamic 指令

Java 7 还引入了 invokedynamic 字节码指令,它允许在运行时动态地绑定方法调用。 invokedynamic 指令是 Lambda 表达式实现的关键。

当编译器遇到 Lambda 表达式时,它会生成一个 invokedynamic 指令,该指令指向一个 bootstrap method。 Bootstrap method 负责在运行时创建一个 call site,Call site 封装了实际要调用的方法句柄。

2.3 Lambda 表达式的转换过程

  1. 编译时: 编译器将 Lambda 表达式转换为一个 invokedynamic 指令。该指令的参数包括 bootstrap method 的引用、Lambda 表达式的签名以及函数式接口的类型。
  2. 运行时: 当 JVM 首次执行 invokedynamic 指令时,它会调用 bootstrap method。
  3. Bootstrap Method: Bootstrap method 的作用是:
    • 查找或创建一个实现了函数式接口的类。
    • 创建一个包含 Lambda 表达式体的方法。
    • 创建一个方法句柄,指向包含 Lambda 表达式体的方法。
    • 返回一个 CallSite 对象,该对象包含方法句柄。
  4. 后续调用: 后续对 Lambda 表达式的调用将直接使用 CallSite 对象中缓存的方法句柄,而无需再次调用 bootstrap method。

2.4 捕获变量

Lambda 表达式可以访问其所在作用域的变量,这称为 捕获变量。根据变量的类型,捕获方式有所不同:

  • 捕获 final 或 effectively final 的局部变量: Lambda 表达式直接复制变量的值。
  • 捕获实例变量或静态变量: Lambda 表达式持有对包含这些变量的对象的引用。

3. 字节码生成示例

为了更清楚地理解 Lambda 表达式的实现,让我们看一个具体的字节码生成示例。

Java 代码:

public class LambdaExample {
    public static void main(String[] args) {
        MyFunctionalInterface adder = (a, b) -> a + b;
        int result = adder.calculate(5, 3);
        System.out.println("Result: " + result);
    }
}

@FunctionalInterface
interface MyFunctionalInterface {
    int calculate(int a, int b);
}

使用 javap -c -v LambdaExample.class 反编译后的字节码(简化版本):


Classfile LambdaExample.class
  Last modified ...
  ...
{
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=3, args_size=1
         0: invokedynamic #7,  0              // InvokeDynamic  #0:calculate:()LLambdaExample$MyFunctionalInterface;
         5: astore_1
         6: aload_1
         7: iconst_5
         8: iconst_3
         9: invokeinterface #8,  3            // InterfaceMethod LambdaExample$MyFunctionalInterface.calculate:(II)I
        14: istore_2
        15: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
        18: new           #10                 // class java/lang/StringBuilder
        21: dup
        22: ldc           #11                 // String Result:
        24: invokespecial #12                 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
        27: iload_2
        28: invokevirtual #13                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
        31: invokevirtual #14                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        34: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        37: return

  private static synthetic java.lang.Object lambda$main$0(java.lang.Integer, java.lang.Integer);
    descriptor: (Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
    flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
    Code:
      stack=2, locals=2, args_size=2
         0: iload_0
         1: iload_1
         2: iadd
         3: invokestatic  #5                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
         6: areturn
}
Constant pool:
   #1 = Methodref          #4.#28         // java/lang/Object."<init>":()V
   #2 = Class              #29             // LambdaExample
   #3 = Utf8               LambdaExample
   #4 = Class              #30             // java/lang/Object
   #5 = Methodref          #31.#32         // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   #6 = InvokeDynamic      #0:#37          // #0:calculate:()LLambdaExample$MyFunctionalInterface;
   #7 = NameAndType        #38:#39         // calculate:()LLambdaExample$MyFunctionalInterface;
   #8 = InterfaceMethodref #40.#41         // LambdaExample$MyFunctionalInterface.calculate:(II)I
   #9 = Fieldref           #42.#43         // java/lang/System.out:Ljava/io/PrintStream;
  #10 = Class              #44             // java/lang/StringBuilder
  #11 = String             #45             // Result:
  #12 = Methodref          #44.#46         // java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
  #13 = Methodref          #44.#47         // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  #14 = Methodref          #44.#48         // java/lang/StringBuilder.toString:()Ljava/lang/String;
  #15 = Methodref          #49.#50         // java/io/PrintStream.println:(Ljava/lang/String;)V
  #16 = Utf8               <init>
  #17 = Utf8               ()V
  #18 = Utf8               Code
  #19 = Utf8               LineNumberTable
  #20 = Utf8               LocalVariableTable
  #21 = Utf8               this
  #22 = Utf8               LLambdaExample;
  #23 = Utf8               main
  #24 = Utf8               ([Ljava/lang/String;)V
  #25 = Utf8               args
  #26 = Utf8               [Ljava/lang/String;
  #27 = Utf8               lambda$main$0
  #28 = NameAndType        #16:#17         // "<init>":()V
  #29 = Utf8               LambdaExample
  #30 = Utf8               java/lang/Object
  #31 = Class              #51             // java/lang/Integer
  #32 = NameAndType        #52:#53         // valueOf:(I)Ljava/lang/Integer;
  #33 = Class              #54             // java/lang/invoke/LambdaMetafactory
  #34 = Utf8               altMetafactory
  #35 = Utf8               (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #36 = Methodref          #33.#35         // java/lang/invoke/LambdaMetafactory.altMetafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
  #37 = Utf8               BootstrapMethods
  #38 = Utf8               calculate
  #39 = Utf8               ()LLambdaExample$MyFunctionalInterface;
  #40 = Class              #55             // LambdaExample$MyFunctionalInterface
  #41 = NameAndType        #38:#56         // calculate:(II)I
  #42 = Fieldref           #57.#58         // java/lang/System.out:Ljava/io/PrintStream;
  #43 = NameAndType        #59:#60         // out:Ljava/io/PrintStream;
  #44 = Class              #61             // java/lang/StringBuilder
  #45 = Utf8               Result:
  #46 = NameAndType        #16:#62         // "<init>":(Ljava/lang/String;)V
  #47 = NameAndType        #63:#64         // append:(I)Ljava/lang/StringBuilder;
  #48 = NameAndType        #65:#66         // toString:()Ljava/lang/String;
  #49 = Class              #67             // java/io/PrintStream
  #50 = NameAndType        #68:#69         // println:(Ljava/lang/String;)V
  #51 = Class              #70             // java/lang/Integer
  #52 = Utf8               valueOf
  #53 = Utf8               (I)Ljava/lang/Integer;
  #54 = Class              #71             // java/lang/invoke/LambdaMetafactory
  #55 = Class              #72             // LambdaExample$MyFunctionalInterface
  #56 = Utf8               (II)I
  #57 = Class              #73             // java/lang/System
  #58 = NameAndType        #59:#60         // out:Ljava/io/PrintStream;
  #59 = Utf8               out
  #60 = Utf8               Ljava/io/PrintStream;
  #61 = Class              #74             // java/lang/StringBuilder
  #62 = Utf8               (Ljava/lang/String;)V
  #63 = Utf8               append
  #64 = Utf8               (I)Ljava/lang/StringBuilder;
  #65 = Utf8               toString
  #66 = Utf8               ()Ljava/lang/String;
  #67 = Class              #75             // java/io/PrintStream
  #68 = Utf8               println
  #69 = Utf8               (Ljava/lang/String;)V
  #70 = Class              #76             // java/lang/Integer
  #71 = Class              #77             // java/lang/invoke/LambdaMetafactory
  #72 = Class              #78             // LambdaExample$MyFunctionalInterface
  #73 = Class              #79             // java/lang/System
  #74 = Class              #80             // java/lang/StringBuilder
  #75 = Class              #81             // java/io/PrintStream
  #76 = Class              #82             // java/lang/Integer
  #77 = Class              #83             // java/lang/invoke/LambdaMetafactory
  #78 = Class              #84             // LambdaExample$MyFunctionalInterface
  #79 = Class              #85             // java/lang/System
  #80 = Class              #86             // java/lang/StringBuilder
  #81 = Class              #87             // java/io/PrintStream
  #82 = Class              #88             // java/lang/Integer
  #83 = Class              #89             // java/lang/invoke/LambdaMetafactory
  #84 = Class              #90             // LambdaExample$MyFunctionalInterface
  #85 = Class              #91             // java/lang/System
  #86 = Class              #92             // java/lang/StringBuilder
  #87 = Class              #93             // java/io/PrintStream
  #88 = Class              #94             // java/lang/Integer
  #89 = Class              #95             // java/lang/invoke/LambdaMetafactory
  #90 = Class              #96             // LambdaExample$MyFunctionalInterface
  #91 = Class              #97             // java/lang/System
  #92 = Class              #98             // java/lang/StringBuilder
  #93 = Class              #99             // java/io/PrintStream
  #94 = Class              #100            // java/lang/Integer
  #95 = Class              #101            // java/lang/invoke/LambdaMetafactory
  #96 = Class              #102            // LambdaExample$MyFunctionalInterface
  #97 = Class              #103            // java/lang/System
  #98 = Class              #104            // java/lang/StringBuilder
  #99 = Class              #105            // java/io/PrintStream
 #100 = Class              #106            // java/lang/Integer
 #101 = Class              #107            // java/lang/invoke/LambdaMetafactory
 #102 = Class              #108            // LambdaExample$MyFunctionalInterface
 #103 = Class              #109            // java/lang/System
 #104 = Class              #110            // java/lang/StringBuilder
 #105 = Class              #111            // java/io/PrintStream
 #106 = Class              #112            // java/lang/Integer
 #107 = Class              #113            // java/lang/invoke/LambdaMetafactory
 #108 = Class              #114            // LambdaExample$MyFunctionalInterface
 #109 = Class              #115            // java/lang/System
 #110 = Class              #116            // java/lang/StringBuilder
 #111 = Class              #117            // java/io/PrintStream
 #112 = Class              #118            // java/lang/Integer
 #113 = Class              #119            // java/lang/invoke/LambdaMetafactory
 #114 = Class              #120            // LambdaExample$MyFunctionalInterface
 #115 = Class              #121            // java/lang/System
 #116 = Class              #122            // java/lang/StringBuilder
 #117 = Class              #123            // java/io/PrintStream
 #118 = Class              #124            // java/lang/Integer
 #119 = Class              #125            // java/lang/invoke/LambdaMetafactory
 #120 = Class              #126            // LambdaExample$MyFunctionalInterface
 #121 = Class              #127            // java/lang/System
 #122 = Class              #128            // java/lang/StringBuilder
 #123 = Class              #129            // java/io/PrintStream
 #124 = Class              #130            // java/lang/Integer
 #125 = Class              #131            // java/lang/invoke/LambdaMetafactory
 #126 = Class              #132            // LambdaExample$MyFunctionalInterface
 #127 = Class              #133            // java/lang/System
 #128 = Class              #134            // java/lang/StringBuilder
 #129 = Class              #135            // java/io/PrintStream
 #130 = Class              #136            // java/lang/Integer
 #131 = Class              #137            // java/lang/invoke/LambdaMetafactory
 #132 = Class              #138            // LambdaExample$MyFunctionalInterface
 #133 = Class              #139            // java/lang/System
 #134 = Class              #140            // java/lang/StringBuilder
 #135 = Class              #141            // java/io/PrintStream
 #136 = Class              #142            // java/lang/Integer
 #137 = Class              #143            // java/lang/invoke/LambdaMetafactory
 #138 = Class              #144            // LambdaExample$MyFunctionalInterface
 #139 = Class              #145            // java/lang/System
 #140 = Class              #146            // java/lang/StringBuilder
 #141 = Class              #147            // java/io/PrintStream
 #142 = Class              #148            // java/lang/Integer
 #143 = Class              #149            // java/lang/invoke/LambdaMetafactory
 #144 = Class              #150            // LambdaExample$MyFunctionalInterface
 #145 = Class              #151            // java/lang/System
 #146 = Class              #152            // java/lang/StringBuilder
 #147 = Class              #153            // java/io/PrintStream
 #148 = Class              #154            // java/lang/Integer
 #149 = Class              #155            // java/lang/invoke/LambdaMetafactory
 #150 = Class              #156            // LambdaExample$MyFunctionalInterface
 #151 = Class              #157            // java/lang/System
 #152 = Class              #158            // java/lang/StringBuilder
 #153 = Class              #159            // java/io/PrintStream
 #154 = Class              #160            // java/lang/Integer
 #155 = Class              #161            // java/lang/invoke/LambdaMetafactory
 #156 = Class              #162            // LambdaExample$MyFunctionalInterface
 #157 = Class              #163            // java/lang/System
 #158 = Class              #164            // java/lang/StringBuilder
 #159 = Class              #165            // java/io/PrintStream
 #160 = Class              #166            // java/lang/Integer
 #161 = Class              #167            // java/lang/invoke/LambdaMetafactory
 #162 = Class              #168            // LambdaExample$MyFunctionalInterface
 #163 = Class              #169            // java/lang/System
 #164 = Class              #170            // java/lang/StringBuilder
 #165 = Class              #171            // java/io/PrintStream
 #166 = Class              #172            // java/lang/Integer
 #167 = Class              #173            // java/lang/invoke/LambdaMetafactory
 #168 = Class              #174            // LambdaExample$MyFunctionalInterface
 #169 = Class              #175            // java/lang/System
 #170 = Class              #176            // java/lang/StringBuilder
 #171 = Class              #177            // java/io/PrintStream
 #172 = Class              #178            // java/lang/Integer
 #173 = Class              #179            // java/lang/invoke/LambdaMetafactory
 #174 = Class              #180            // LambdaExample$MyFunctionalInterface
 #175 = Class              #181            // java/lang/System
 #176 = Class              #182            // java/lang/StringBuilder
 #177 = Class              #183            // java/io/PrintStream
 #178 = Class              #184            // java/lang/Integer
 #179 = Class              #185            // java/lang/invoke/LambdaMetafactory
 #180 = Class              #186            // LambdaExample$MyFunctionalInterface
 #181 = Class              #187            // java/lang/System
 #182 = Class              #188            // java/lang/StringBuilder
 #183 = Class              #189            // java/io/PrintStream
 #184 = Class              #190            // java/lang/Integer
 #185 = Class              #191            // java/lang/invoke/LambdaMetafactory
 #186 = Class              #192            // LambdaExample$MyFunctionalInterface
 #187 = Class              #193            // java/lang/System
 #188 = Class              #194            // java/lang/StringBuilder
 #189 = Class              #195            // java/io/PrintStream
 #190 = Class              #196            // java/lang/Integer
 #191 = Class              #197            // java/lang/invoke/LambdaMetafactory
 #192 = Class              #198            // LambdaExample$MyFunctionalInterface
 #193 = Class              #199            // java/lang/System
 #194 = Class              #200            // java/lang/StringBuilder
 #195 = Class              #201            // java/io/PrintStream
 #196 = Class              #202            // java/lang/Integer
 #197 = Class              #203            // java/lang/invoke/LambdaMetafactory
 #198 = Class              #204            // LambdaExample$MyFunctionalInterface
 #199 = Class              #205            // java/lang/System
 #200 = Class              #206            // java/lang/StringBuilder
 #201 = Class              #207            // java/io/PrintStream
 #202 = Class              #208            // java/lang/Integer
 #203 = Class              #209            // java/lang/invoke/LambdaMetafactory
 #204 = Class              #210            // LambdaExample$MyFunctionalInterface
 #205 = Class              #211            // java/lang/System
 #206 = Class              #212            // java/lang/StringBuilder
 #207 = Class              #213            // java/io/PrintStream
 #208 = Class              #214            // java/lang/Integer
 #209 = Class              #215            // java/lang/invoke/LambdaMetafactory
 #210 = Class              #216            // LambdaExample$MyFunctionalInterface
 #211 = Class              #217            // java/lang/System
 #212 = Class              #218            // java/lang/StringBuilder
 #213 = Class              #219            // java/io/PrintStream
 #214 = Class              #220            // java/lang/Integer
 #215 = Class              #221            // java/lang/invoke/LambdaMetafactory
 #216 = Class              #222            // LambdaExample$MyFunctionalInterface
 #217 = Class              #223            // java/lang/System
 #218 = Class              #224            // java/lang/StringBuilder
 #219 = Class              #225            // java/io/PrintStream
 #220 = Class              #226            // java/lang/Integer
 #221 = Class              #227            // java/lang/invoke/LambdaMetafactory
 #222 = Class              #228            // LambdaExample$MyFunctionalInterface
 #223 = Class              #229            // java/lang/System
 #224 = Class              #230            // java/lang/StringBuilder
 #225 = Class              #231            // java/io/PrintStream
 #226 = Class              #232            // java/lang/Integer
 #227 = Class              #233            // java/lang/invoke/LambdaMetafactory
 #228 = Class              #234            // LambdaExample$MyFunctionalInterface
 #229 = Class              #235            // java/lang/System
 #230 = Class              #236            // java/lang/StringBuilder
 #231 = Class              #237            // java/io/PrintStream
 #232 = Class              #238            // java/lang/Integer
 #233 = Class              #239            // java/lang/invoke/LambdaMetafactory
 #234 = Class              #240            // LambdaExample$MyFunctionalInterface
 #235 = Class              #241            // java/lang/System
 #236 = Class              #242            // java/lang/StringBuilder
 #237 = Class              #243            // java/io/PrintStream
 #238 = Class              #244            // java/lang/Integer
 #239 = Class              #245            // java/lang/invoke/LambdaMetafactory
 #240 = Class              #246            // LambdaExample$MyFunctionalInterface
 #241 = Class              #247            // java/lang/System
 #242 = Class              #248            // java/lang/StringBuilder
 #243 = Class              #249            // java/io/PrintStream
 #244 = Class              #250            // java/lang/Integer
 #245 = Class              #251            // java/lang/invoke/LambdaMetafactory
 #246 = Class              #252            // LambdaExample$MyFunctionalInterface
 #247 = Class              #253            // java/lang/System
 #248 = Class              #254            // java/lang/StringBuilder
 #249 = Class              #255            // java/io/PrintStream
 #250 = Class              #256            // java/lang/Integer
 #251 = Class              #257            // java/lang/invoke/LambdaMetafactory
 #252 = Class              #258            // LambdaExample$MyFunctionalInterface
 #253 = Class              #259            // java/lang/System
 #254 = Class              #260            // java/lang/StringBuilder
 #255 = Class              #261            // java/io/PrintStream
 #256 = Class              #262            // java/lang/Integer
 #257 = Class              #263            // java/lang/invoke/LambdaMetafactory
 #258 = Class              #264            // LambdaExample$MyFunctionalInterface
 #259 = Class              #265            // java/lang/System
 #260 = Class              #266            // java/lang/StringBuilder
 #261 = Class              #267            // java/io/PrintStream
 #262 = Class              #268            // java/lang/Integer
 #263 = Class              #269            // java/lang/invoke/LambdaMetafactory
 #264 = Class              #270            // LambdaExample$MyFunctionalInterface
 #265 = Class              #271            // java/lang/System
 #266 = Class              #272            // java/lang/StringBuilder
 #267 = Class              #273            // java/io/PrintStream
 #268 = Class              #274            // java/lang/Integer
 #269 = Class              #275            // java/lang/invoke/LambdaMetafactory
 #270 = Class              #276            // LambdaExample$MyFunctionalInterface
 #271 = Class              #277            // java/lang/System
 #272 = Class              #278            // java/lang/StringBuilder
 #273 = Class              #279            // java/io/PrintStream
 #274 = Class              #280            // java/lang/Integer
 #275 = Class              #281            // java/lang/invoke/LambdaMetafactory
 #276 = Class              #282            // LambdaExample$MyFunctionalInterface
 #277 = Class              #283            // java/lang/System
 #278 = Class              #284            // java/lang/StringBuilder
 #279 = Class              #285            // java/io/PrintStream
 #280 = Class              #286            // java/lang/Integer
 #281 = Class              #287            // java/lang/invoke/LambdaMetafactory
 #282 = Class              #288            // LambdaExample$MyFunctionalInterface
 #283 = Class              #289            // java/lang/System
 #284 = Class              #290            // java/lang/StringBuilder
 #285 = Class              #291            // java/io/PrintStream
 #286 = Class              #292            // java/lang/Integer
 #287 = Class              #293            // java/lang/invoke/LambdaMetafactory
 #288 = Class              #294            // LambdaExample$MyFunctionalInterface
 #289 = Class              #295            // java/lang/System
 #290 = Class              #296            // java/lang/StringBuilder
 #291 = Class              #297            // java/io/PrintStream
 #292 = Class              #298            // java/lang/Integer
 #293 = Class              #299            // java/lang/invoke/LambdaMetafactory
 #294 = Class              #300            // LambdaExample$MyFunctionalInterface
 #295 = Class              #301            // java/lang/System
 #296 = Class              #302            // java/lang/StringBuilder
 #297 = Class              #303            // java/io/PrintStream
 #298 = Class              #304            // java/lang/Integer
 #299 = Class              #305            // java/lang/invoke/LambdaMetafactory
 #300 = Class              #306            // LambdaExample$MyFunctionalInterface
 #301 = Class              #307            // java/lang/System
 #302 = Class              #308            // java/lang/StringBuilder
 #303 = Class              #309            // java/io/PrintStream
 #304 = Class              #310            // java/lang/Integer
 #305 = Class              #311            // java/lang/invoke/LambdaMetafactory
 #306 = Class              #312            // LambdaExample$MyFunctionalInterface
 #307 = Class              #313            // java/lang/System
 #308 = Class              #314            // java/lang/StringBuilder
 #309 = Class              #315            // java/io/PrintStream
 #310 = Class              #316            // java/lang/Integer
 #311 = Class              #317            // java/lang/invoke/LambdaMetafactory
 #312 = Class              #318            // LambdaExample$MyFunctionalInterface
 #313 = Class              #319            // java/lang/System
 #314 = Class              #320            // java/lang/StringBuilder
 #315 = Class              #321            // java/io/PrintStream
 #316 = Class              #322            // java/lang/Integer
 #317 = Class              #323            // java/lang/invoke/LambdaMetafactory
 #318 = Class              #324            // LambdaExample$MyFunctionalInterface
 #319 = Class              #325            // java/lang/System
 #

发表回复

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