Bedenken Sie den folgenden Codeausschnitt:
Consumer<String> lambda1 = s -> {}; Function<String, String> lambda2 = s -> s; Consumer<String> lambda3 = LambdaTest::consume; // but s -> s doesn't work! Function<String, String> lambda4 = LambdaTest::consume;
Gemäß der Verbraucherschnittstelle ist es definiert als void Accept(T t); Daher könnte man über die Zuweisung von Lambda3 verwirrt sein, da die Methode „consume“ einen String zurückgibt. Überraschenderweise wird auch Lambda4 zugewiesen.
Dieses Szenario wird auf die flexible Gestaltung von Methodenreferenzen in Java zurückgeführt. Es ermöglicht die Anpassung einer Methode an eine funktionale Schnittstelle auf die gleiche Weise wie der direkte Aufruf der Methode. Mit anderen Worten, man kann jede Methode aufrufen, die einen Wert zurückgibt, und den zurückgegebenen Wert ignorieren.
Lambda-Ausdrücke gibt es in zwei Formen:
Der Ausdruck s -> s ist nicht void-kompatibel, da s keine Anweisung ist. Allerdings ist s -> s.toString() kann sein, da Methodenaufrufe Anweisungen sind.
Ausdrücke, die als Anweisungen verwendet werden können (gemäß Java-Sprachspezifikation §14.8), umfassen:
Es ist wichtig zu beachten, dass die Form (arg) -> methodReturningVoid(arg) ist die einzige Ausdrucksform, die nicht mit Werten kompatibel ist.
Das obige ist der detaillierte Inhalt vonWarum funktioniert eine Java-Methodenreferenz mit einem Rückgabewert mit der „Consumer'-Schnittstelle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!