Heim  >  Artikel  >  Java  >  Warum erlaubt mir mein forEach-Lambda nicht, meine Funktion mit einer Return-Anweisung in Java zu beenden?

Warum erlaubt mir mein forEach-Lambda nicht, meine Funktion mit einer Return-Anweisung in Java zu beenden?

Barbara Streisand
Barbara StreisandOriginal
2024-09-26 07:06:42919Durchsuche

Why won

Angenommen, Sie haben einen Korb mit Lebensmitteln:

List<Food> basket = List.of(
     new Food("Apple", FRUIT),
     new Food("Banana", FRUIT),
     new Food("Carrot", VEGETABLE),
     new Food("Orange", FRUIT),
);

Und eine Auflage, diesen Korb nur anzunehmen, wenn er nur mit Früchten gefüllt ist. Um diese Anforderung zu erfüllen, entscheiden Sie sich für die Implementierung einer for-Schleife:

private boolean containtsOnlyFruits(List<Food> basket) {
for (Food food : basket) {
        if (food.getFoodType() != FRUIT) {
            return false;
        }
    }
    return true;
}

Dann erinnern Sie sich, dass Sie etwas über Java-Lambdas und einen funktionaleren Ansatz gelernt haben, und beschließen, dasselbe in einem forEach-Lambda zu schreiben:

private boolean containtsOnlyFruits(List<Food> basket) {
    basket.forEach(food -> {
        if (food.getFoodType() != FRUIT) {
            return false;
        }
    });
    return true;
}

Nur ​​um auf einen Fehler zu stoßen:

unerwarteter Rückgabewert

Warum ist das so?

Ein Lambda ist nichts anderes als eine Funktion. In diesem Fall eine anonyme Funktion, also eine Funktion ohne Namen. Wie jede andere Funktion kann ein Lambda Argumente empfangen und auch eine Rückgabe erwarten.

Wenn Sie versuchen, vom forEach-Lambda „false“ zurückzugeben, versuchen Sie tatsächlich, diese anonyme Funktion zu verlassen und einen booleschen Wert auszugeben. Es wird jedoch nicht erwartet, dass die Funktion forEach ein Ergebnis zurückgibt. So ist diese Funktion einfach nicht implementiert.

Wenn Sie sich tatsächlich die Implementierung der forEach-Funktion ansehen, werden Sie feststellen, dass sie einen Consumer akzeptiert:

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

Ein Consumer ist eine Schnittstelle, die eine Operation darstellt, die ein einzelnes Eingabeargument akzeptiert und kein Ergebnis zurückgibt. In dieser Implementierung können Sie sehen, dass die forEach-Funktion unter der Haube eine for every-Schleife verwendet, die angegebene Aktion ausführt und nichts zurückgibt.

Um unseren Betrieb in einem funktionalen Ansatz zu erfüllen, müssen wir ein anderes Lambda finden. Hier gibt es einen guten Kandidaten: allMatch.

Mit dem allMatch-Lambda können wir prüfen, ob alle Elemente des Korbs eine Frucht sind:

private boolean onlyFruits(List<Food> basket) {
    return basket.stream().allMatch(food -> food.getFoodType() == FRUIT);
}

Wenn das der Fall ist, wird unser Lambda true zurückgeben. Und wenn wir uns das Innere von allMatch ansehen:

boolean allMatch(Predicate<? super T> predicate);

Wir werden sehen, dass die allMatch-Funktion ein Prädikat erwartet.

Ein Prädikat ist eine funktionale Schnittstelle, genau wie ein Verbraucher, aber es funktioniert etwas anders. Während ein Verbraucher eine Operation darstellt, die ein einzelnes Eingabeargument akzeptiert und kein Ergebnis zurückgibt, stellt ein Prädikat ein Prädikat (boolesche Funktion) eines Arguments dar, das verwendet wird, um ein Objekt auf eine Bedingung zu testen und einen booleschen Wert (wahr oder falsch) zurückzugeben ).

Es gibt noch weitere sehr wichtige Funktionsschnittstellen. Können Sie mir sagen, was sie sind und wie sie wirken?

Bleiben Sie neugierig!

Beitragen

Schreiben erfordert Zeit und Mühe.Ich liebe es zu schreiben und Wissen zu teilen, aber ich habe auch Rechnungen zu bezahlen.

Wenn Ihnen meine Arbeit gefällt, erwägen Sie bitte eine Spende über Buy Me a Coffee: https://www.buymeacoffee.com/RaphaelDeLio

Oder indem Sie mir BitCoin senden: 1HjG7pmghg3Z8RATH4aiUWr156BGafJ6Zw

Das obige ist der detaillierte Inhalt vonWarum erlaubt mir mein forEach-Lambda nicht, meine Funktion mit einer Return-Anweisung in Java zu beenden?. 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