在这个函数中可以发现为Lambda表达式生成了一个内部类,为了验证是否生成内部类,可以在运行时加上-Djdk.internal.lambda.dumpProxyClasses,加上这个参数后,运行时,会将生成的内部类class码输出到一个文件中
final class Lambda$$Lambda$1 implements Print {
private Lambda$$Lambda$1();
public void print(java.lang.Object);
}
如果运行javap -c -p 则结果如下
final class Lambda$$Lambda$1 implements Print {
private Lambda$$Lambda$1();
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: return
public void print(java.lang.Object);
Code:
0: aload_1
1: checkcast #14 // class java/lang/String
4: invokestatic #20 // Method Lambda.lambda$0:(Ljava/lang/String;)V
7: return
}
通过上面的字节码指令可以发现实现上调用的是Lambda.lambda$0这个私有的静态方法
因此最终的Lambda表达式等价于以下形式
@FunctionalInterface
interface Print<T> {
public void print(T x);
}
public class Lambda {
public static void PrintString(String s, Print<String> print) {
print.print(s);
}
private static void lambda$0(String x) {
System.out.println(x);
}
final class $Lambda$1 implements Print{
@Override
public void print(Object x) {
lambda$0((String)x);
}
}
public static void main(String[] args) {
PrintString("test", new Lambda().new $Lambda$1());
}
}