Warum verhalten sich der äquivalente Lambda-Ausdruck und die Methodenreferenz beim Erfassen des statischen Feldwerts anders?

8

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

ersetzen

s - & 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.

    
j2esu 22.06.2016, 23:14
quelle

1 Antwort

10

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

%Vor%

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

%Vor%

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 ist    ExpressionName :: [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 oder ExpressionName , wie er bei Verwendung des Methodenreferenzausdrucks ermittelt wurde   ausgewertet.

  •   
  • Die Argumente für den Methodenaufruf-Ausdruck sind die formalen Parameter der Aufrufmethode.

  •   
    
Sotirios Delimanolis 22.06.2016, 23:34
quelle