In Java können Methodenreferenzen zum Erstellen funktionaler Schnittstellen verwendet werden. Die Consumer-Schnittstelle beispielsweise nimmt ein einzelnes Argument und führt darauf eine Aktion aus. Überraschenderweise können Methodenreferenzen mit Rückgabetypen auch mit der Consumer-Schnittstelle übereinstimmen.
Die Entscheidung, dieses Verhalten zuzulassen, basierte auf der Idee, Methoden auf funktionale Schnittstellen anzupassen, ähnlich wie sie aufgerufen werden. Insbesondere kann jede Methode, die einen Wert zurückgibt, an eine Consumer-Schnittstelle angepasst werden, auch wenn der Rückgabewert ignoriert wird.
Bezüglich Lambda-Ausdrücken gibt es zwei Formen: (args) -> Ausdruck und (Argumente) -> { Aussagen* }. Die letztere Form kann void-kompatibel sein, wenn kein Codepfad versucht, einen Wert zurückzugeben. Die erstere Form ist wertkompatibel, wenn der Ausdruck einen Wert ergibt. Wenn der Ausdruck jedoch auch eine Anweisung ist (z. B. ein Methodenaufruf oder ein Inkrementierungs-/Dekrementierungsoperator), kann er void-kompatibel sein.
Zum Beispiel ist der Ausdruck s -> s ist wertkompatibel, während s -> i ist leerkompatibel. Dies liegt daran, dass Inkrementierungs-/Dekrementierungsoperatoren als eigenständige Anweisungen verwendet werden können. Ein weiterer mit Leerzeichen kompatibler Ausdruck ist s -> new Whatever(s), da Ausdrücke zur Erstellung von Klasseninstanzen auch als Anweisungen verwendet werden können.
Interessanterweise (arg) -> methodReturningVoid(arg) ist die einzige Ausdrucksform, die nicht wertkompatibel ist.
Das obige ist der detaillierte Inhalt vonWarum können Methodenreferenzen mit Rückgabetypen die Consumer-Schnittstelle in Java implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!