Wäre es der empfohlene Weg, um einen Stream in ein gleitendes Fenster zu verwandeln?
Zum Beispiel könnten Sie in Ruby each_cons verwenden:
%Vor%In Guava fand ich nur Iterators # partition , die verwandt aber kein gleitendes Fenster ist:
%Vor%Es gibt keine solche Funktion in der API, da sie sowohl sequenzielle als auch parallele Verarbeitung unterstützt und es ist wirklich schwierig, eine effiziente Parallelverarbeitung für Sliding-Window-Funktionen für beliebige Stream-Quellen bereitzustellen (sogar effiziente Paare paralleler Verarbeitung sind ziemlich schwierig, ich habe sie implementiert), also ich weiß).
Wenn Ihre Quelle jedoch List
mit schnellem Direktzugriff ist, können Sie subList()
method verwenden, um das gewünschte Verhalten wie folgt zu erhalten:
Eine ähnliche Methode ist in meiner StreamEx Bibliothek verfügbar: siehe StreamEx.ofSubLists()
.
Es gibt auch einige andere Lösungen von Drittanbietern, die sich nicht für die parallele Verarbeitung interessieren und gleitende Funktionen mit einem internen Puffer bereitstellen. Zum Beispiel, protonpack StreamUtils.windowed
.
Wenn Sie eine Drittanbieterbibliothek verwenden möchten und keine Parallelität benötigen, bietet jOOλ ein Fenster im SQL-Stil funktioniert wie folgt
%Vor%ergibt
%Vor%Und
%Vor%ergibt
%Vor%Disclaimer: Ich arbeite für die Firma hinter jOOλ
Eine weitere Option cyclops-reaction baut auf jOOλs Seq-Interface (und JDK-8-Stream) auf, ist aber einfach zu reagieren baut Gleichzeitigkeit / Parallelität wieder auf (wenn das für Sie wichtig ist - indem Sie Streams of Futures erstellen).
Sie können Lukas 'mächtige Fensterfunktionen mit beiden Bibliotheken verwenden (wie wir das tolle JOOλ erweitern), aber es gibt auch einen Gleitoperator, der meiner Ansicht nach die Dinge vereinfacht und für unendliche Ströme geeignet ist (dh er tut es nicht 't konsumiere den Stream, puffert aber die Werte, während sie durchfließen.
Mit ReactiveSeq < Es würde ungefähr so aussehen -
%Vor%Mit LazyFutureStream könnte so aussehen wie im folgenden Beispiel -
%Vor%Statische Equivalant-Methoden zum Erstellen einer gleitenden Ansicht über java.util.stream.Stream werden auch in Cyclops-Streams bereitgestellt StreamUtils Klasse.
%Vor%Wenn Sie direkt mit jeder gleitenden Ansicht arbeiten möchten, können Sie den slidingT-Operator verwenden, der einen List Transformer zurückgibt. Um beispielsweise jedem Element in jeder gleitenden Ansicht eine Zahl hinzuzufügen, reduzieren Sie jedes gleitende Fenster auf die Summe seiner Elemente, die wir ausführen können: -
%Vor%Disclaimer: Ich arbeite für die Firma hinter Cyclops-reactive
Wenn Sie die ganze Power von Scalas persistenten Sammlungen in Java bringen möchten, können Sie die Java-Sprache verwenden.
%Vor%Sie können nicht nur Iterator verwenden, dies funktioniert auch für fast jede andere Javaslang-Sammlung: Array, Vektor, Liste, Stream, Warteschlange, HashSet, LinkedHashSet, TreeSet, ...
(Übersicht Javaslang 2.1.0-alpha)
Disclaimer: Ich bin der Schöpfer von Javaslang
Tags und Links java java-8 java-stream