Wie Lambda-Ausdrücke in Java-Bytecode übersetzt werden
Ich versuche, ein Beispiel mit Lambda-Ausdruck in Java zu erstellen, und ich verwende offiziell JDK8. Mein Beispiel wurde erfolgreich ausgeführt. Aber wenn ich versuche zu überprüfen, wie der Compiler Lambda-Ausdruck in Byte-Code übersetzt, ist das verwirrend. Das Folgende ist der Code meines Beispiels:
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));
}
}
In diesemArtikeldiskutieren sie darüber, wie der Compiler die Lambda-Ausdrücke in Byte-Code umsetzt. Nach diesem Dokument wandelt sich der Lambda-Ausdruck instatic
Methode und der Ort, an dem der Lambda-Ausdruck deklariert wird, beziehen sich auf Lambdastatic
Methode. Das folgende Beispiel befindet sich im Artikel:
//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);
}
}
Mein Beispiel läuft gut und geben Sie uns das entsprechende Ergebnis. Aber wenn ich versuche, diejavap
Befehl zum Überprüfen des Bytecodes der Klasse, es gibt keine statische Methode für Lambdas im Bytecode.
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[]);
}
Im Falle von Generika wird die Bridge-Methode vom Compiler erstellt und wir werden diese Methode auch mit überprüfenjavap
Befehl, aber im Fall von Lambdas gibt es keinestatic
Methode. Der Artikel wurde 2012 veröffentlicht und Java 8 wurde im März 2014 veröffentlicht. Ich habe also einige Fragen zu lambda transnational: