Durch das Schreiben von Anwendungen in Java gibt es viele Anwendungsfälle für java.util.Collection
. Da java.util.stream.Stream
mit Java 8 eingeführt wurde, kam ich über einige Anwendungsfälle, in denen es schwierig ist zu entscheiden, was zu verwenden ist.Entscheidung zwischen der Verwendung eines Stream oder einer Schleife
Zum Beispiel: Sie werden einige util-Methoden schreiben.
public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
return toFilter.stream()
.filter((Object o) -> hash == o.hashCode())
.collect(Collectors.toCollection(LinkedList::new));
}
Was es so zu schreiben:
public static List<?> filterHashToList(int hash, Collection<?> toFilter) {
List<Object> result = new LinkedList<>();
for(Object o : toFilter) {
if(hash == o.hashCode()) {
result.add(o);
}
}
return result;
}
Beiden Methoden zum gleichen Ergebnis führen würden. java.util.stream.Stream
und java.util.stream.Collector
sind Schnittstellen, daher kann die Implementierung auch variieren, wenn ich benutzerdefinierte Streams und Collectors verwende.
Ich denke, es gibt viele Implementierungen da draußen mit dem altmodischen Loop-Weg.
Also, ist es möglich, zu beantworten, was zu verwenden, Stream oder Loop, von Use-Case? Und wenn ja, müssen alle Implementierungen gegebenenfalls aktualisiert werden?
Oder sollte ich beide Möglichkeiten durch die Implementierung von util-Methoden bieten? Oder sollte ich auch eine mthed bereitstellen, die den Stream nach dem Filterprozess zurückgibt, damit Sie bei Bedarf auch mit dem Stream arbeiten können?
Sie können wirklich einfache Parallelität mit Streams haben, sie sind kompakter (manche würden "lesbarer" sagen) und haben weitere Vorteile, wenn Ihre Streams tatsächliche "Streams" sind (etwas fließt dynamisch ein - nicht auf Basis eines feste Sammlung wie hier). Aber in Ihrem speziellen Fall denke ich, dass Sie in beide Richtungen gehen könnten. – mastov
Also können wir das verkürzen zu: Streams sollen bevorzugt werden, aber in einfachen Anwendungsfällen ist beides in Ordnung? – narranoid
Ich würde zwei einfache Regeln verwenden: 1. Wenn es nicht kaputt ist, repariere es nicht. 2. Verwenden Sie das, was Sie am besten lesen und pflegen können. Das heißt, Ihre beiden Beispiele geben nicht die gleiche Sache zurück: Einer gibt eine ArrayList zurück und der andere gibt eine LinkedList zurück. –