Ich habe Probleme, die Stream
Schnittstelle in Java 8 zu verstehen , insbesondere dort, wo sie mit den Schnittstellen Spliterator
und zu tun hat Collector
. Mein Problem ist, dass ich Spliterator
die Collector
Schnittstellen einfach noch nicht verstehen kann und die Schnittstelle daher Stream
für mich immer noch etwas dunkel ist.
Was genau ist a Spliterator
und a Collector
und wie kann ich sie verwenden? Was soll ich tun und was nicht, wenn ich bereit bin, mein eigenes Spliterator
oder Collector
(und wahrscheinlich mein eigenes Stream
in diesem Prozess) zu schreiben ?
Ich habe einige Beispiele gelesen, die im Internet verstreut sind, aber da hier alles noch neu ist und Änderungen unterliegt, sind Beispiele und Tutorials immer noch sehr spärlich.
quelle
Collectors.of
eine alte Methode der Beta-Version entfernt worden oder fehlt mir etwas? Der Vollständigkeit halber(x,y) -> x+y
kann geschrieben werden alsInteger::sum
.Spliterator
bedeutet im Grunde "spaltbarer Iterator".Ein einzelner Thread kann den gesamten Spliterator selbst durchlaufen / verarbeiten, aber der Spliterator verfügt auch über eine Methode, mit
trySplit()
der ein Abschnitt für eine andere Person (normalerweise einen anderen Thread) "abgespalten" wird, sodass der aktuelle Spliterator weniger Arbeit benötigt.Collector
kombiniert die Spezifikation einerreduce
Funktion (von Map-Reduce-Ruhm) mit einem Anfangswert und einer Funktion zum Kombinieren von zwei Ergebnissen (wodurch die Ergebnisse von Spliterated-Arbeitsströmen kombiniert werden können).Zum Beispiel würde der grundlegendste Collector eine anfängliche vaue von 0 haben, eine Ganzzahl zu einem vorhandenen Ergebnis hinzufügen und zwei Ergebnisse durch Hinzufügen 'kombinieren'. Auf diese Weise wird ein spliterierter Strom von ganzen Zahlen summiert.
Sehen:
Spliterator.trySplit()
Collector<T,A,R>
quelle
Im Folgenden finden Sie Beispiele für die Verwendung der vordefinierten Kollektoren zur Ausführung allgemeiner veränderlicher Reduktionsaufgaben:
quelle
Schnittstelle
Spliterator
- ist eine Kernfunktion von Streams .Die
stream()
undparallelStream()
Standardmethoden werden in derCollection
Benutzeroberfläche dargestellt. Diese Methoden verwenden den Spliterator über den Aufruf vonspliterator()
:Spliterator ist ein interner Iterator, der den Stream in kleinere Teile aufteilt. Diese kleineren Teile können parallel bearbeitet werden.
Unter anderem gibt es zwei wichtige Methoden, um den Spliterator zu verstehen:
boolean tryAdvance(Consumer<? super T> action)
Im Gegensatz zuIterator
versucht es, die Operation mit dem nächsten Element auszuführen. Wenn die Operation erfolgreich ausgeführt wurde, gibt die Methode zurücktrue
. Andernfalls wird zurückgegebenfalse
- das bedeutet, dass kein Element oder kein Ende des Streams vorhanden ist.Spliterator<T> trySplit()
Diese Methode ermöglicht es, einen Datensatz nach dem einen oder anderen Kriterium (Dateigröße, Anzahl der Zeilen usw.) in viele kleinere Sätze aufzuteilen.quelle