Ich bin wenig verwirrt zwischen Stream#findAny()
und Stream#findFirst()
von der Stream
API in Java 8.
Was ich verstanden habe ist, dass beide das erste übereinstimmende Element aus dem Stream zurückgeben, wenn sie beispielsweise in Verbindung mit einem Filter verwendet werden?
Warum also zwei Methoden für dieselbe Aufgabe? Vermisse ich etwas
quelle
filter
angewendet wird,findAny
jedes Element zurückkehren können, einschließlich , dass nicht der Filter angewendet überein?findAny
jedes Element (zufällig) zurückgeben, insbesondere bei parallelen Stream-OperationenNein, beide geben das erste Element des Streams nicht zurück.
Von
Stream.findAny()
(Hervorhebung von mir):Einfacher ausgedrückt kann es das erste Element des Streams auswählen oder nicht.
Ich glaube, dass mit der aktuellen Oracle-spezifischen Implementierung das erste Element in einer nicht parallelen Pipeline zurückgegeben wird. In einer parallelen Pipeline wird dies jedoch nicht immer der Fall sein (zum Beispiel
System.out.println(IntStream.range(0, 100).parallel().findAny());
wird es ausgeführt,OptionalInt[50]
wenn ich es ausgeführt habe). Darauf dürfen Sie sich jedenfalls nicht verlassen.quelle
findFirst gibt die ersten Elemente des Streams zurück, aber findAny kann jedes Element im Stream auswählen.
quelle
im parallelen Modus
findAny
garantiert das nicht die Reihenfolge, aber dasfindFirst
tut.Ich habe ein Code-Snippet geschrieben, um den Unterschied zu zeigen. Besuchen Sie es
quelle
In stream findFirst und findAny wird das erste Element zurückgegeben und der Rest nicht ausgeführt. In parallelStream ist es jedoch nicht passabel, die Reihenfolge anzugeben, und parallelStream führt den Rest der Sammlung aus.
Referenz
Zeit 1:25:00
quelle
Ich werde nur sagen, dass Vorsicht vor
findFirst()
undfindAny()
während der Verwendung.Ab ihrem Javadoc ( hier und hier ) geben beide Methoden ein beliebiges Element aus dem Stream zurück - es sei denn, der Stream hat eine Begegnungsreihenfolge . In diesem Fall wird
findFirst()
das erste Element zurückgegeben, währendfindAny()
ein beliebiges Element zurückgegeben wird.Angenommen, wir haben einen benutzerdefinierten
list
ISBN- und BOOK-Namen. Ein Szenario finden Sie in diesem Beispiel:Ausgabe :
Optional[Java in Action]
Es kann Szenarien geben, in denen der Buchname identisch ist, die ISBN-Nummern jedoch unterschiedlich sind. In diesem Fall kann das Sortieren und Auffinden des Buches dem Buch sehr ähnlich sein
findAny()
und zu falschen Ergebnissen führen. Stellen Sie sich ein Szenario vor, in dem 5 Bücher den Namen "Java Reference" tragen, aber unterschiedliche ISBN-Nummern haben und dasfindFirst()
Buch nach Namen dasselbe ergibt wiefindAny()
.Stellen Sie sich ein Szenario vor, in dem:
Hier liefern findFirst () und findAny () das gleiche Ergebnis, auch wenn sie nach BookByName sortiert sind.
Ausführlicher Artikel:
quelle
Wann
Stream
ist ungeordnetfindFirst()
undfindAny()
sind gleich. Aber wannStream
bestellt wird,findAny()
wird besser.quelle