Ich habe eine Anforderung, bei der ich Java Stream Api verwenden möchte, um einen Stream von Ereignissen von einem System zu verarbeiten und einen Datenbereinigungsprozess anzuwenden, um wiederholte Ereignisse zu entfernen. Dadurch wird das gleiche Ereignis mehrfach hintereinander gelöscht, und es wird keine Liste eindeutiger Ereignisse erstellt. Die meisten Java Stream API-Beispiele, die online verfügbar sind, zielen darauf ab, eine bestimmte Ausgabe von einer gegebenen Eingabe zu erzeugen.
Beispiel für den Eingabestream
[a, b, c, a, a, a, a, d, d, d, c, c, e, e, e, e, e, e, f, f, f]
Die Ausgabe-Liste oder der Stream sollte
sein[a, b, c, a, d, c, e, f]
Meine aktuelle Implementierung (ohne Stream api) sieht wie
aus %Vor%Ausgabe,
%Vor%Ich habe verschiedene Beispiele mit reducing, groupingBy usw. ausprobiert, ohne Erfolg. Ich kann anscheinend keinen Weg finden, einen Strom mit dem letzten Element in meinem Akkumulator zu vergleichen, wenn es eine solche Möglichkeit gibt.
Sie können IntStream
verwenden, um die Indexpositionen in List
zu erhalten und wie folgt zu Ihrem Vorteil zu verwenden:
Erläuterung
IntStream.range(0,list.size())
: Gibt eine Sequenz von primitiven int-wertigen Elementen zurück, die als Indexpositionen für den Zugriff auf die Liste verwendet werden. filter(i -> ((i < list.size() - 1 && !list.get(i).equals(list.get(i + 1) || i == list.size() - 1))
: Fortfahren nur, wenn das Element an der aktuellen Indexposition ungleich dem Element an der nächsten Indexposition ist oder wenn die letzte Indexposition erreicht ist mapToObj(i -> list.get(i)
: Konvertiere den Stream in ein Stream<String>
. collect(Collectors.toList())
: Sammeln Sie die Ergebnisse in einer Liste. Sie können einen benutzerdefinierten Collector verwenden, um Ihre Ziele zu erreichen Tor. Bitte finden Sie Details unten:
%Vor% Es kann jedoch einige Probleme geben, wenn parallel
stream verwendet wird.
BEARBEITEN : Wie von @Bolzano kommentiert, erfüllt dieser Ansatz nicht die Anforderung.
Wenn t
der Eingabestream ist, dann
erzeugt einen Stream von eindeutigen Elementen ohne Erstellen einer Liste.
Dann eine einfache
%Vor%kann eine Liste mit eindeutigen Elementen erstellen.
Ich verstehe nicht, warum so langwierige Lösungen wie @CKing und @Anton benötigt werden? Fehle ich etwas?
Bitte versuchen Sie diese Lösung:
%Vor%}
Ausgabe: [1, 2, 3, 4, 1]
Lösung ohne Karte:
%Vor%}
Tags und Links java java-8 java-stream