Gibt es eine elegante Möglichkeit, einen Stream in Chunks zu verarbeiten?

10

Mein genaues Szenario besteht darin, Daten stapelweise in die Datenbank einzufügen, also möchte ich DOM-Objekte dann alle 1000 akkumulieren und sie leeren.

Ich habe es implementiert, indem ich Code in den Akkumulator gesetzt habe, um Fülle zu erkennen, dann flush, aber das scheint falsch zu sein - die Flush-Kontrolle sollte vom Aufrufer kommen.

Ich könnte den Stream in eine Liste umwandeln und dann subList auf eine iterative Weise verwenden, aber auch das scheint klobig.

Gibt es eine nette Möglichkeit, alle n Elemente zu bearbeiten und dann mit dem Stream fortzufahren, während der Stream nur einmal verarbeitet wird?

    
Bohemian 20.12.2014, 19:33
quelle

2 Antworten

5

Eleganz liegt im Auge des Betrachters. Wenn es Ihnen nichts ausmacht, eine Stateful-Funktion in groupingBy zu verwenden, können Sie dies tun:

%Vor%

Dadurch werden keine Leistungs- oder Speicherbenutzungspunkte über Ihrer ursprünglichen Lösung erzielt, da es immer noch den gesamten Stream materialisiert, bevor Sie etwas tun.

Wenn Sie die Liste nicht materialisieren möchten, hilft Ihnen die Stream-API nicht. Sie müssen den Iterator oder Spliterator des Streams abrufen und so etwas tun:

%Vor%     
Misha 22.12.2014 02:15
quelle
4

Die Verwendung der StreamEx -Lösung würde wie

aussehen %Vor%

Ausgabe:

%Vor%

groupRuns akzeptiert Prädikat, das entscheidet, ob 2 Elemente in derselben Gruppe sein sollen.

Erzeugt eine Gruppe, sobald sie das erste Element findet, das nicht zu ihr gehört.

    
Nazarii Bardiuk 25.07.2016 17:58
quelle

Tags und Links