Wie transformiert man einen Java-Stream in ein gleitendes Fenster?

8

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%     
Philipp Claßen 08.12.2015, 14:38
quelle

4 Antworten

12

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:

%Vor%

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 .

    
Tagir Valeev 08.12.2015, 15:03
quelle
9

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λ

    
Lukas Eder 06.01.2016 23:00
quelle
6

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

    
John McClean 10.01.2016 23:43
quelle
2

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

    
Daniel Dietrich 12.03.2017 11:32
quelle

Tags und Links