Wenn du nur wissen willst, ob es eine Übereinstimmung gibt, solltest du list.stream().anyMatch(some predicate)
verwenden, nicht nur, weil es effizienter ist, sondern auch, weil es das richtige Idiom ist, um deine Absicht auszudrücken.
Wie von anderen gesagt, ist anyMatch
kurzgeschlossen, was bedeutet, dass es bei der ersten Übereinstimmung stoppt, während count
, wie der Name schon sagt, alle Treffer zählt, bevor es zurückkehrt . Abhängig vom Stream-Inhalt kann dies einen enormen Leistungsunterschied bewirken. Beachten Sie jedoch, dass Sie count
ähnlich effizient machen können, indem Sie
list.stream().filter(some predicate).limit(1).count() > 0
Dann wird es auch nach dem ersten Auftreten anhalten, aber wie gesagt, anyMatch
ist immer noch der bevorzugte Weg, um auszudrücken, dass Sie daran interessiert sind, ob es irgendeine Übereinstimmung gibt. Die Dinge ändern sich, wenn die Aufgabe darin besteht, herauszufinden, ob mindestens n
übereinstimmt. Dann wird .limit(n).count() > n-1
(oder >= n
) zum natürlichen Idiom.
Beachten Sie, dass sich findFirst()
von der anderen Lösung unterscheidet, da ihre Antwort von der Reihenfolge abhängt. Wenn Sie also nur wissen möchten, ob es eine Übereinstimmung gibt, sollten Sie stattdessen findAny()
verwenden. Dennoch gibt es einen theoretischen Unterschied aufgrund der Anforderung, den übereinstimmenden Wert zurückzugeben, verglichen damit, nur zu sagen, ob es eine Übereinstimmung gibt, wie anyMatch
, obwohl dieser Unterschied derzeit nur in der Konstruktion einer Optional
-Instanz liegt ist vernachlässigbar.
Da Sie jedoch mit einer API programmieren, um Ihre Absicht zu verschlüsseln, sollten Sie find…
nicht verwenden, wenn Sie nur wissen möchten, ob eine Übereinstimmung besteht. anyMatch
drückt Ihre Absicht deutlich aus und könnte in zukünftigen Implementierungen oder komplexeren Szenarien einen noch höheren Nutzen haben.
findAny
(was besser ist als findFirst
, wenn Sie keine Bestellung benötigen) und anyMatch
sind Kurzzirkeloperationen , was bedeutet, dass sie früher zurückkehren können, ohne den gesamten Stream zu verbrauchen, wenn die Bedingungen es zulassen. Dies wird in der Methode Javadocs . count()
ist nicht .
Wenn die letzte Phase des Streams noch einen Spliterator mit der GRÖßE count()
filter()
- sehr wahrscheinlich den SIZED-Aspekt verwerfen.
All diese Informationen können der Paketdokumentation entnommen werden, es wird dringend empfohlen, sie zu lesen.
Tags und Links java java-8 java-stream