【发布时间】:2014-06-01 17:32:27
【问题描述】:
我正在尝试在 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));
}
}
在Article 中,他们讨论了编译器如何将 lambda 表达式转换为字节码。根据该文档将 lambda 表达式转换为 static 方法和 lambda 表达式声明的位置,参考 lambda 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);
}
}
我的示例运行良好,并为我们提供了适当的结果。但是当我尝试运行javap 命令来检查类的字节码时,字节码中没有用于lambdas 的静态方法。
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[]);
}
在泛型的情况下,桥方法是由编译器创建的,我们还将使用javap 命令检查此方法,但在 lambda 的情况下,没有static 方法。文章发表于 2012 年,java 8 于 2014 年 3 月发布。所以我对 lambda 的跨国有一些疑问:
- 在本文发布之后,JDK 8 中是否有任何用于 lambda 的新实现,否则我会在检查 lambda 方法时做错什么?
- 编译器如何处理 lambda 表达式?
- JVM 如何调用 lambda 表达式?
【问题讨论】:
标签: java lambda jvm java-8 compiler-theory