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))) {
...
}
13349700cookie-checkWie kann ich mit einem Lambda-Ausdruck prüfen, ob ein Element vorhanden ist?yes
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