Ich habe gerade ein schnelles Experiment in Eclipse durchgeführt.
%Vor%Wenn der Methodenreferenztest fehlschlägt, beginnt die Ablaufverfolgung
%Vor% Es gibt keine Referenz zurück zu der Linie, auf der die Methodenreferenz verwendet wird, obwohl das Ende der Kurve (nicht gezeigt) mit findFirst
on zurück auf die Linie verweist.
Während der Stack-Stack von lamdba beginnt
%Vor%In Zeile 26 wurde das Lambda korrekt identifiziert.
Ist das eine Eigenheit des Eclipse-Compilers oder ist dies ein genereller Nachteil der Verwendung von Methodenreferenzen, die bei der Auswahl zwischen ihnen und einem Lambda berücksichtigt werden sollten?
Nein, so ist es derzeit implementiert.
Zitieren ein Papier von Brian Goetz über die Übersetzung von Lambda-Ausdrücken:
Wenn der Compiler auf einen Lambda-Ausdruck stößt, wird der Lambda-Body zuerst (desugars) in eine Methode reduziert, deren Argumentliste und Rückgabetyp mit der des Lambda-Ausdrucks
übereinstimmen...
Methodenreferenzen werden genauso behandelt wie Lambda-Ausdrücke, mit der Ausnahme, dass die meisten Methodenreferenzen nicht in eine neue Methode entzuckt werden müssen; Wir können einfach eine Konstante für die referenzierte Methode laden und diese an die Metafactory übergeben.
Der einzige Unterschied zwischen Ihren beiden Stacktraces besteht darin, dass der Zeile mit dem expliziten Lambda diese Zeile hinzugefügt wurde:
%Vor% Dies liegt daran, dass das Lambda von javac
in eine neu generierte Methode übersetzt wurde, und Sie können tatsächlich im Stacktrace sehen, dass diese neue Methode lambda%code%
war.
Bei einer Methodenreferenz muss keine neue Methode generiert werden, da sie direkt auf eine vorhandene Methode verweist.
Nein - in der Tat erhalten Sie mehr Klarheit.
Die Tatsache, dass die Zeile at com.example.StackTractTest.lambda%code%(StackTractTest.java:26)
in der Lambda-Version erscheint, erinnert Sie daran, dass ein Lambda für diese Technik erstellt wird, während eine Methodenreferenz nichts extra erzeugt.
Das Lambda wird zur Laufzeit erstellt, die Methodenreferenz kann zur Kompilierzeit erstellt werden.
Tags und Links java java-8 lambda stack-trace method-reference