Ich bin ein wenig verwirrt über Java-Lambdas und Methodenreferenzen. Zum Beispiel haben wir diesen Code:
%Vor%Ausgabe:
%Vor%Dies funktioniert wie erwartet, aber wenn wir
ersetzens - & gt; sBuilder.append (s)
mit
sBuilder :: append
Die Ausgabe ist:
%Vor%Haben Sie irgendwelche Ideen, wie Sie das erklären können? Das sind nicht die gleichen Dinge? Danke.
Im Lambda-Ausdruck wird das Feld sBuilder
erfasst, aber nicht ausgewertet. Es wird nur ausgewertet, wenn die entsprechende Funktionsschnittstellenmethode aufgerufen wird. An diesem Punkt verweist% ce_de% auf die neue Instanz, die erstellt und dem Feld zugewiesen wurde, mit
In der Methodenreferenz wird das Feld sBuilder
sofort ausgewertet, um eine sBuilder
-Instanz zu erzeugen. Dieser Wert verweist auf die im statischen Initialisierer erstellte Instanz
und die Consumer
funktionieren auf dieser. Sie drucken das neue.
Aus der Java-Sprachspezifikation für das Ausführen -Zeitauswertung von Methodenreferenzen
Der Text einer Aufrufmethode hängt von der Form der Methode ab Referenzausdruck wie folgt:
Wenn das Formular
Consumer
oder istExpressionName :: [TypeArguments] Identifier
, dann der Körper des Aufrufmethode hat den Effekt eines Methodenaufrufausdrucks für eine Kompilierzeitdeklaration, bei der es sich um die Kompilierzeitdeklaration handelt der Methodenreferenzausdruck. Laufzeitbewertung der Methode Aufrufausdruck ist wie in §15.12.4.3, §15.12.4.4, und spezifiziert §15.12.4.5, wobei:
Der Aufrufmodus wird von der Deklaration der Kompilierung gemäß §15.12.3 abgeleitet.
Die Zielreferenz ist der Wert von
Primary :: [TypeArguments] Identifier
oderExpressionName
, wie er bei Verwendung des Methodenreferenzausdrucks ermittelt wurde ausgewertet.Die Argumente für den Methodenaufruf-Ausdruck sind die formalen Parameter der Aufrufmethode.
Tags und Links java java-8 lambda method-reference