Я пытаюсь создать пример с использованием выражения lambda в java, и я использую официальный JDK8. Мой пример успешно выполнен. Но когда я пытаюсь проверить, как компилятор переводит лямбда-выражение в байтовый код, это вызывает у меня некоторую путаницу. Следующим является код моего примера: -
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));
}
}
В этой статье они обсуждают, как компилятор переводит лямбда-выражения в байтовый код. В соответствии с этим документом выражение лямбда преобразуется в метод 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);
}
}
Мой пример работает нормально и дает нам соответствующий результат. Но когда я пытаюсь запустить команду 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[]);
}
В случае generics метод bridge создается компилятором, и мы также будем проверять этот метод с помощью команды javap
, но в случае lambdas нет метода static
. Статья была опубликована в 2012 году, а java 8 была запущена в марте 2014 года. Поэтому у меня есть некоторые вопросы относительно транснациональной лямбда:
- Есть ли какая-либо новая реализация, используемая для lambda в JDK 8 после выпуска этой статьи, или я сделаю что-то неправильно, чтобы проверить метод лямбда?
- Как действительно компилятор имеет дело с выражением лямбда?
- Как JVM вызывает lambda exression?