Próbuję utworzyć przykład za pomocą wyrażenia lambda w java i używam Offical JDK8. Mój przykład został pomyślnie uruchomiony. Ale kiedy próbuje sprawdzić jak kompilator przetłumaczyć wyrażenie lambda do kodu bajtowego, to sprawia, że niektóre confusion.Following jest kod mojego przykład: -Jak wyrażeń lambdy są tłumaczone w Java Byte Code
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));
}
}
W tym Article, dyskutują o tym, jak kompilator przetłumaczyć lambda wyrażenia do kodu bajtowego. Zgodnie z tym dokumentem wyrażenie lambda przekształca się w metodę static
i miejsce, w którym deklaruje się wyrażenie lambda, ma odniesienie do metody lambda static
. Następujący przykład znajduje się w artykule:
//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);
}
}
Mój przykład działa dobrze i daje nam odpowiedni wynik. Ale gdy próbuję uruchomić komendę javap
w celu sprawdzenia kodu bajtów klasy, nie ma statycznej metody dla lambdas w kodzie bajtowym.
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[]);
}
W przypadku leków generycznych, metoda most jest tworzony przez kompilator i będziemy również sprawdzić tę metodę przy użyciu polecenia javap
, ale w przypadku lambda nie ma static
metoda. Artykuł został opublikowany w 2012 roku i Java 8 było uruchomienie w marcu 2014 roku, więc mam kilka pytań dotyczących ponadnarodowym lambda:
- Czy istnieje nowa realizacja wykorzystywane do lambda w JDK 8 po tej wersji artykułu lub zrobię coś nie tak, aby sprawdzić metodę lambda?
- Jak naprawdę kompilator radzi sobie z wyrażeniem lambda?
- W jaki sposób JVM odwołuje się do wygaśnięcia lambda?