lambda 和 匿名内部类的区别

前言

Lambda表达式似乎只是为了简化匿名内部类书写,这看起来仅仅通过语法糖在编译阶段把所有的Lambda表达式替换成匿名内部类就可以了。但实时并非如此。在JVM层面,Lambda表达式和匿名内部类有着明显的差别。

匿名内部类实现

匿名内部类仍然是一个类,编译后会产生一个 class 文件

Lambda表达式实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainLambda {
...
public static void main(java.lang.String[]);
Code:
0: new #2 // class java/lang/Thread
3: dup
4: invokedynamic #3, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable; /*使用invokedynamic指令调用*/
9: invokespecial #4 // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
12: invokevirtual #5 // Method java/lang/Thread.start:()V
15: return

private static void lambda$main$0(); /*Lambda表达式被封装成主类的私有方法*/
Code:
0: getstatic #6 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #7 // String Lambda Thread run()
5: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}

反编译代码可以看出来Lambda表达式被封装成了主类的一个私有方法,并通过invokedynamic指令进行调用。

注意 this

这样 lambda 里使用 this 和在类外面使用是一致的


lambda 和 匿名内部类的区别
http://xxpain.github.io/2021/11/09/lambda/
作者
无情小肥羊
发布于
2021年11月9日
许可协议