Lambda 表达式如何在 Java 字节代码中转换
2022-09-02 04:18:34
我正在尝试使用java中的lambda表达式创建一个示例,并且我正在使用官方的JDK8。我的示例已成功运行。但是当我试图检查编译器如何将lambda表达式转换为字节代码时,这让我有些困惑。以下是我示例的代码:-
public class LambdaTest {
public Integer lambdaBinaryOpertor(BinaryOperator<Integer> binaryOperator) {
return binaryOperator.apply(60, 72);
}
public static void main(String[] args) {
LambdaTest test = new LambdaTest();
BinaryOperator<Integer> binaryOperator = (a, b) -> a*b;
System.out.println("Additon using Lambda BinaryOperator: "+test.lambdaBinaryOpertor(binaryOperator));
}
}
在本文中,他们将讨论编译器如何将 lambda 表达式转换为字节码。根据本文档将 lambda 表达式转换为方法和 lambda 表达式声明的位置,具有 lambda 方法的参考。下面的例子在文章中:static
static
//Source code
class A {
public void foo() {
List<String> list = ...
list.forEach( s -> { System.out.println(s); } );
}
}
//After compile above code "translate code "
class A {
public void foo() {
List<String> list = ...
list.forEach( [lambda for lambda$1 as Block] );
}
static void lambda$1(String s) {
System.out.println(s);
}
}
我的例子运行良好,并给我们适当的结果。但是当我尝试运行命令来检查类的字节代码时,字节代码中没有lambda的静态方法。javap
c:\>javap LambdaTest
Compiled from "LambdaTest.java"
public class LambdaTest {
public LambdaTest();
public java.lang.Integer lambdaBinaryOpertor(java.util.function.BinaryOperator <java.lang.Integer>);
public static void main(java.lang.String[]);
}
在泛型的情况下,桥接方法由编译器创建,我们也将使用命令检查此方法,但在lambdas的情况下没有方法。这篇文章发表于2012年,java 8于2014年3月发布。所以我对lambda的跨国性有一些疑问:javap
static
- 在本文发布后,JDK 8中是否有任何用于lambda的新实现,或者我会做错一些事情来检查lambda方法?
- 编译器到底是如何处理 lambda 表达式的?
- JVM 如何调用 lambda exression?