Lassen Sie uns nun einen kurzen Blick auf Java Stream werfen. Grundsätzlich wird es unter Bezugnahme auf JavaDoc of Stream zusammengefasst, jedoch auf die Methode Da Details wie die Typvariable des internen Arguments weggelassen werden, finden Sie Details in JavaDoc. Stream ist ein Konzept, das in Java 8 veröffentlicht wurde und verschiedene Verarbeitungen für eine Sammlung von Elementen ausführen kann.
Stream-Vorgänge können in drei Phasen unterteilt werden: Generieren, Zwischenschalten und Beenden. Generierungs- und Beendigungsoperationen können nur einmal pro Stream-Operation ausgeführt werden, Zwischenoperationen können jedoch mehrmals ausgeführt werden. Da die Zwischenoperationsmethode als Methode konzipiert ist, die eine Stream-Instanz zurückgibt, kann sie durch eine Methodenkette beschrieben werden.
Ergebnisvariable=Generieren().Zwischenbetrieb 1().Zwischenbetrieb 2().Zwischenbetrieb 3().Kündigungsoperation();
Wie der Name schon sagt, wird beim Erstellen zuerst ein Stream erstellt.
Stream ist jedoch eine Schnittstelle, und Implementierungsklassen werden nicht in der üblichen instanziierten Form bereitgestellt.
Die Sammlung bietet die Methoden stream ()
und parallel ()
, mit denen Sie den Stream eines Elements abrufen können. In vielen Fällen möchten Sie jedoch nur den Stream abrufen, ohne eine Sammlung zu erstellen.
Daher können Sie einen Stream mit den folgenden statischen Methoden erstellen, die von Stream bereitgestellt werden.
Methode | Inhalt | Elementanzahl |
---|---|---|
empty() | [] | Begrenzt(Himmel) |
of(Object e1, Object e2, Object e3, …) | [e1, e2, e3, …] | Begrenzt(Gleich wie Argument) |
iterate(T s,Function f) | [s, f(s), f(f(s)), f(f(f(s))))…} | unendlich |
generate(Function f) | [f(),f(),f(),f()…] | unendlich |
concat(Stream s1, Stream s2) | [Alle Elemente von s1,Alle Elemente von s2] | Durch Argument |
Elementtyp in T: Stream
Sie können auch den Builder von Stream.builder () verwenden, um einen Stream zu generieren.
Builder<Integer> builder = Stream.builder();
IntStream s = Stream.builder().add(1).add(2).add(3).build();
Unendliche Streams, die durch "iterieren" oder "generieren" erzeugt werden, müssen mit der unten beschriebenen Zwischenoperation "limit" unterbrochen werden (andernfalls geraten Sie in eine Endlosschleife).
Zwischenoperationen werden mit den Elementen im Stream ausgeführt. Die Zwischenoperation gibt eine neue Stream-Instanz zurück, nachdem die Operation auf jedes Element angewendet wurde, sodass Sie die Zwischenoperationen in der Methodenkette verketten können. Zwischenoperationen werden grob in charakteristische Änderungsoperationen, zustandslose Operationen und zustandsbehaftete Operationen unterteilt.
Die Eigenschaftsänderungsoperation ist eine Operation, die die Eigenschaften des Streams selbst ändert. Die Elemente des Inhalts ändern sich nicht. Es wird in der übergeordneten Schnittstelle BaseStream und nicht in Stream definiert.
Methode | Inhalt |
---|---|
parallel() | Paralleler Stream |
sequential() | Sequentieller Stream |
unordered() | Ungeordneter Stream |
onClose(Runnable r) | Registrieren eines Handlers zum Abschluss |
Zustandslose Zwischenoperationen sind Zwischenoperationen, die von anderen Elementen nicht beeinflusst werden, wenn sie an einem Element arbeiten. Daher ist es für die Parallelverarbeitung geeignet, und es wird empfohlen, die Zwischenverarbeitung so zustandslos wie möglich zu gestalten. Im Folgenden sind e und en (n: Ganzzahl) die Elemente im Stream.
Methode | Inhalt |
---|---|
filter(Predicate p) | p(e)Wenn false, löschen Sie das Element e |
map(Function f) | [f(e1),f(e2),f(e3),…] |
flatMap(Function f) | [f(e1)Alle Elemente des Streams werden von zurückgegeben, f(e2)Alle Elemente des Streams werden von zurückgegeben,f(e3)Alle Elemente des Streams werden von zurückgegeben,…] |
peek(Function f) | Führen Sie f für jedes Element aus und lassen Sie die Elemente des Streams unverändert |
Stateful Intermediate-Operationen sind Intermediate-Operationen, die von anderen Elementen beeinflusst werden, wenn Sie ein Element bearbeiten. Bei einigen Vorgängen müssen möglicherweise alle Elemente im Stream das Ergebnis zurückgeben. Ein Beispiel ist beispielsweise die sortierte Methode, mit der die Sortierverarbeitung realisiert wird. Aufgrund des Einflusses anderer Faktoren erfordern zustandsbehaftete Zwischenoperationen die Kontrolle über die komplexe Verarbeitung während der Parallelverarbeitung, was weniger effizient sein kann als die sequentielle Verarbeitung.
Methode | Inhalt |
---|---|
distinct() | Entfernen Sie doppelte Elemente im Stream |
sorted() | Sortieren in natürlicher Reihenfolge für vergleichbare Implementierungsklassen |
sorted(Comparator c) | Sortieren mit Comparator |
limit(long maxSize) | Auf die Länge von bis zu maxSize-Elementen abschneiden |
skip(long n) | Verwerfen Sie die ersten n Elemente |
"Limit" wird insbesondere als Kurzschluss-Zwischenoperation bezeichnet. Kurzschlussoperationen sind Operationen, die das Potenzial haben, einen unendlichen Strom in einen endlichen Strom umzuwandeln.
Es ist leicht zu glauben, dass "Limit" und "Überspringen" in der Parallelverarbeitung schneller sind als "Unterscheidbar" und "Sortiert", da sie nur die Anzahl der Elemente betrachten, aber in einem geordneten Stream "n von Anfang an". Dies ist eine kostspielige Operation, da Sie es herausfinden müssen. Wenn Sie die parallele Ausführung priorisieren möchten und die Reihenfolge nicht beibehalten müssen, können Sie eine Verbesserung der Effizienz erwarten, indem Sie nicht mit "ungeordnet" bestellen.
Die Beendigungsoperation verarbeitet den Inhalt des Streams zum Zeitpunkt seines Aufrufs und gibt ein anderes Ergebnis als den Stream zurück (einschließlich kein Ergebnis (ungültig)). Nach Abschluss des Beendigungsvorgangs wird der bis dahin verwendete Stream unbrauchbar. Wenn Sie versuchen, ihn erneut zu verwenden, wird eine IllegalStateException ausgelöst. Daher ist es richtig, Stream-Objekte in der Methodenkette und nicht in Variablen zu behandeln.
Methode | Rückgabetyp | Inhalt |
---|---|---|
close() | void | Schließen Sie den Stream. Alle bei onClose registrierten Close Handler werden aufgerufen |
iterator() | Iterator | Gibt einen Iterator zurück |
spliterator() | Spliterator | Gibt den Splitter zurück |
forEach(Consumer action) | void | Führen Sie die Aktion für jedes Element aus. Bestellung nicht garantieren |
forEachOrdered(Consumer action) | void | Wie bei jedem, garantiert jedoch die Bestellung |
toArray() | Object[] | Ordnen |
reduce(T unit, BinaryOperator acc) | T | die Ermäßigung(Falten).. Gibt das Ergebnis der Kombination von Elementen mit der kumulativen Funktion acc für die Einheit Elementeinheit zurück. |
collect(Supplier factory, BiConsumer acc, BiConsumer combiner) | Ergebnisbehälter | Variable Reduzierung. Ab Werk erzeugter variabler Container(Zum Beispiel ArrayList)Fügen Sie andererseits ein Element mit acc hinzu und kombinieren Sie jeden Behälter mit einem Kombinierer. |
min() | Optional | Gibt das kleinste Element zurück. Sonderfall der Ermäßigung |
max() | Optional | Gibt das größte Element zurück. Sonderfall der Ermäßigung |
count() | long | Gibt die Anzahl der Elemente zurück. Sonderfall der Ermäßigung |
anyMatch(Predicate p) | boolean | p(e)Gibt true zurück, wenn auch nur eines der Bewertungsergebnisse true ist |
allMatch(Predicate p) | boolean | p(e)Gibt true zurück, wenn alle Bewertungsergebnisse von |
noneMatch(Predicate p) | boolean | p(e)Gibt true zurück, wenn alle Bewertungsergebnisse false sind |
findFirst() | Optional | Gibt das erste Element zurück. Gibt beliebige Elemente für ungeordnete Streams zurück |
findAny() | Optional | Gibt ein beliebiges Element zurück |
Elementtyp in T: Stream
Ist es schwierig, die Reduktionsoperationen wie "Reduzieren" und "Sammeln" zu verstehen? Ich werde in naher Zukunft mehr darüber in einem anderen Artikel schreiben. → Geschrieben. Auch der unbekannte Name Splitterator kam heraus. Ein Splitterator ist ein Iterator, der parallel verarbeitet werden kann (teilbar). Splitterer werden im Strom behandelt, und während der Parallelverarbeitung wird die Verarbeitung für jeden geteilten Splitterator durchgeführt.
Recommended Posts