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:

Gibt es eine neue Implementierung für Lambda in JDK 8 nach dieser Artikelveröffentlichung oder werde ich etwas falsch machen, um die Lambda-Methode zu überprüfen?Wie geht der Compiler wirklich mit Lambda-Ausdrücken um?Wie ruft die JVM die Lambda-Exression auf?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage