Heim  >  Artikel  >  Java  >  Warum funktioniert eine Java-Methodenreferenz mit einem Rückgabewert mit der „Consumer'-Schnittstelle?

Warum funktioniert eine Java-Methodenreferenz mit einem Rückgabewert mit der „Consumer'-Schnittstelle?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-22 18:04:12507Durchsuche

Why Does a Java Method Reference with a Return Value Work with the `Consumer` Interface?

Warum eine Java-Methodenreferenz mit Rückgabetyp mit der Verbraucherschnittstelle übereinstimmt

Problem

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.

Erklärung

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-Ausdrucksunterscheidung

Lambda-Ausdrücke gibt es in zwei Formen:

  1. ( args) -> Ausdruck: Wertkompatibel, wenn der Ausdruck einen Wert ergibt.
  2. (args) -> { Anweisungen* }: Void kompatibel, wenn kein Codepfad versucht, einen Wert zurückzugeben.

Der Ausdruck s -> s ist nicht void-kompatibel, da s keine Anweisung ist. Allerdings ist s -> s.toString() kann sein, da Methodenaufrufe Anweisungen sind.

Kompatible Formen

Ausdrücke, die als Anweisungen verwendet werden können (gemäß Java-Sprachspezifikation §14.8), umfassen:

  • Methodenaufrufe
  • Inkrementieren/Dekrementieren Operatoren
  • Zuweisungen
  • Ausdrücke zur Erstellung von Klasseninstanzen

Einschränkung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn