Ich habe gerade angefangen, mit Java 8 Lambdas zu spielen, und ich versuche, einige der Dinge, die ich gewohnt bin, in funktionale Sprachen zu implementieren.
Beispielsweise haben die meisten funktionalen Sprachen eine Suchfunktion, die mit Sequenzen arbeitet, oder Listen, die das erste Element zurückgeben, für das das Prädikat ist true
. Der einzige Weg, dies in Java 8 zu erreichen, ist:
lst.stream()
.filter(x -> x > 5)
.findFirst()
Dies scheint mir jedoch ineffizient zu sein, da der Filter die gesamte Liste scannt, zumindest nach meinem Verständnis (was falsch sein könnte). Gibt es einen besseren Weg?
java
java-8
java-stream
Siki
quelle
quelle
Antworten:
Nein, der Filter scannt nicht den gesamten Stream. Es ist eine Zwischenoperation, die einen Lazy Stream zurückgibt (tatsächlich geben alle Zwischenoperationen einen Lazy Stream zurück). Um Sie zu überzeugen, können Sie einfach den folgenden Test durchführen:
Welche Ausgänge:
Sie sehen, dass nur die beiden ersten Elemente des Streams tatsächlich verarbeitet werden.
So können Sie mit Ihrem Ansatz gehen, der vollkommen in Ordnung ist.
quelle
get();
hier verwendet , weil ich weiß, welche Werte ich in die Stream-Pipeline einspeise und daher ein Ergebnis ergibt. In der Praxis sollten Sie nicht verwendenget();
, aberorElse()
/orElseGet()
/orElseThrow()
(für einen aussagekräftigeren Fehler anstelle eines NSEE), da Sie möglicherweise nicht wissen, ob die auf die Stream-Pipeline angewendeten Operationen zu einem Element führen..findFirst().orElse(null);
zum BeispielorElse
?Optional
Typ belassen sollten, was.findFirst
zurückkehrt. Eine der Verwendungsmöglichkeiten von Optional besteht darin, Entwicklern zu helfen, sich nicht mitnull
Seg zu befassen, anstatt zu prüfenmyObject != null
, ob SiemyOptional.isPresent()
andere Teile der optionalen Benutzeroberfläche überprüfen oder verwenden können. Hat das klarer gemacht?Nein, wird es nicht - es wird "brechen", sobald das erste Element gefunden wird, das das Prädikat erfüllt. Sie können mehr über Faulheit im Stream-Paket javadoc lesen , insbesondere (Hervorhebung von mir):
quelle
Ich musste nur ein Objekt aus einer Liste von Objekten herausfiltern. Also habe ich das benutzt, hoffe es hilft.
quelle
.orElse(null) != null
. Stattdessen nutzen die die optionale API.isPresent
dh.findFirst().isPresent()
..stream().map(ParkingLot::getId).anyMatch(Predicate.isEqual(id))
Verwenden Sie diese Option zusätzlich zu Alexis Cs Antwort: Wenn Sie mit einer Array-Liste arbeiten, in der Sie nicht sicher sind, ob das gesuchte Element vorhanden ist.
Dann können Sie einfach überprüfen, ob a ist
null
.quelle
quelle
Verbesserte Einzeiler -Antwort: Wenn Sie nach einem booleschen Rückgabewert suchen, können wir dies besser tun, indem wir isPresent hinzufügen:
quelle