Wie kann ich mit einem Lambda-Ausdruck prüfen, ob ein Element vorhanden ist?

Lesezeit: 3 Minuten

Benutzer-Avatar
Miljac

Insbesondere habe ich TabPane, und ich würde gerne wissen, ob es ein Element mit einer bestimmten ID darin gibt.

Ich möchte dies also mit einem Lambda-Ausdruck in Java tun:

boolean idExists = false;
String idToCheck = "someId";

for (Tab t : tabPane.getTabs()){
    if(t.getId().equals(idToCheck)) {
        idExists = true;
    }
}

  • Ich würde auf einfache Weise und sauber mit der List.contains-Methode schreiben. Beispiel: return tabPane.getTabs().contains(idToCheck);

    – Soja

    4. Januar 2021 um 11:46 Uhr

Benutzer-Avatar
Masudul

Versuchen zu benutzen anyMatch des Lambda-Ausdrucks. Es ist ein viel besserer Ansatz.

 boolean idExists = tabPane.getTabs().stream()
            .anyMatch(t -> t.getId().equals(idToCheck));

  • Ebenfalls erwähnenswert: Wenn Sie die Überprüfung negieren möchten, verwenden Sie sie noneMatch Anstatt von anyMatch.

    – Schwarzlicht

    9. August 2018 um 9:02 Uhr

  • Der Aufruf erfordert API-Level 24

    – FabioStein

    5. April 2019 um 12:41 Uhr

Während die akzeptierte Antwort richtig ist, werde ich (meiner Meinung nach) eine elegantere Version hinzufügen:

boolean idExists = tabPane.getTabs().stream()
    .map(Tab::getId)
    .anyMatch(idToCheck::equals);

Vernachlässigen Sie nicht die Verwendung Stream#map() was es ermöglicht, die Datenstruktur vor dem Anwenden der zu glätten Predicate.

  • was ist hier besser? Ich sehe nur noch eine Operation. Tut mir leid, ich bin neu in dieser Lamba-Sache.

    – TecHunter

    26. April 2017 um 15:05 Uhr

  • @TecHunter es ist expliziter. Stellen Sie sich vor, Sie lesen diesen Code zum ersten Mal oder nach einer Weile erneut. Das hat mehrere Vorteile: Erstens zeigen wir sofort, dass uns eigentlich nicht der Reiter interessiert, sondern ein Mapping davon. Zweitens zeigen wir durch die Verwendung von Methodenreferenzen (was nur möglich ist, weil wir das anfängliche Lambda in zwei Schritte aufteilen), dass im Code keine Überraschungen verborgen sind. Drittens erstellen wir durch die Verwendung von Methodenreferenzen kein neues Prädikat, sondern verwenden es wirklich nur wieder equals. Zugegeben, das Beispiel hier ist sehr einfach, aber ich hoffe, Sie verstehen, was ich meine.

    – Malte Hartwig

    17. Mai 2017 um 16:21 Uhr

  • @MalteHartwig danke! Ja, ich bekomme Ihre 3 Punkte, aber ich habe nach der Abflachung gefragt map, macht es einen weiteren Verarbeitungsschritt nein? Ich werde versuchen, die beiden Methoden zu vergleichen 🙂

    – TecHunter

    18. Mai 2017 um 12:00 Uhr

  • @MalteHartwig getestet in einer 10kk ArrayList mit einem einfachen Objekt, das versucht, das letzte Element zu finden. ergibt einen 2ms unterschied 131ms gegen 133ms für deine. Auf einem 1kk-Array listet deins auf, wenn es um 2 ms schneller ist (55 ms bis 53 ms). Also können wir sagen, dass deins besser ist 🙂

    – TecHunter

    18. Mai 2017 um 13:40 Uhr

  • @TecHunter-Getter sind supergünstig. Bevorzugen Sie immer die Klarheit des Codes, anstatt zusätzliche 2 Millisekunden zu sparen (obwohl ich bezweifle, dass die Ergebnisse genau sind, können sie bei jedem Lauf schwanken). Denken Sie außerdem daran, dass Zwischenoperationen auf Streams (wie z map) sind faul natürlich. Das bedeutet, dass getId -Methode wird nicht auf jedes Element der Auflistung angewendet. Es wird faul ausgewertet bis anyMatch kehrt zurück Stimmt.

    – jFrenetisch

    25. Mai 2017 um 0:43 Uhr


Die obigen Antworten erfordern, dass Sie ein neues Stream-Objekt mallocieren.

public <T>
boolean containsByLambda(Collection<? extends T> c, Predicate<? super T> p) {

    for (final T z : c) {
        if (p.test(z)) {
            return true;
        }
    }
    return false;
}

public boolean containsTabById(TabPane tabPane, String id) {
    return containsByLambda(tabPane.getTabs(), z -> z.getId().equals(id));
}
...
if (containsTabById(tabPane, idToCheck))) {
   ...
}

1334970cookie-checkWie kann ich mit einem Lambda-Ausdruck prüfen, ob ein Element vorhanden ist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy