Ich habe kürzlich über Streams in Java 8 gelernt und begann mit ihnen zu arbeiten. Jetzt habe ich eine Frage bezüglich der groupingBy
Sammler Methode:Java 8 GroupingBy in Peek
Normalerweise ich mit .NET arbeiten, so verglich ich (zu wissen, sie sind nicht das gleiche) Java Stream<T>
mit .NET IEnumerable<T>
. Nach diesem Vergleich speichert List<T>
Elemente und die jeweiligen Operationen. Ein Beispiel:
C#:
elements.Where(x => x.Value == 5).ToList();
Java:
elements.stream().filter(x -> x.getValue() == 5).collect(Collectors.toList());
In beiden Beispielen, beginne ich mit einer Liste definiert Operationen (ein Filter in diesem Beispiel) und sammeln das Ergebnis zu speichern es (in einer neuen Liste in diesem Beispiel).
Jetzt habe ich einen komplexeren Fall:
data.stream()
.map(...).filter(...) // Some operations
.collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)));
Das Ergebnis dieser Abfrage ist eine Map<String, Long>
und ich kann mit dieser Arbeit, aber sagen wir mal, ich mit dieser Daten fortfahren möchten anstatt es zu speichern. Mein aktueller Ansatz ist trivial:
...
.collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)))
.entrySet().stream().
.map(...) // Do more operations
Aber auf diese Weise, ich den Strom verlassen, speichern Sie das erste Ergebnis in einer Karte und öffnen einen neuen Stream fortzusetzen. Gibt es eine Möglichkeit, ohne einen Sammler zu gruppieren, so dass ich im Strom "bleiben" kann?
Da Sie gruppieren, müssen Sie ziemlich viel zu einem Zwischenspeicher gehen - was, wenn Sie einen Wert am Anfang des Streams mit einem Wert am Ende gruppieren müssen? Sie müssten "alles" verarbeiten und speichern, bis Sie sicher sind, dass es nichts mehr zu gruppieren gibt. Also müsste Java (/ könnte?) Die Dinge auf eine Karte (oder eine ähnliche Struktur) stellen; Was ist so schlimm daran, das selbst zu tun? –
Es ist nicht wirklich ein Problem, ich kann mit meinem trivialen Ansatz leben, aber in all meinen anderen Stream-Operationen gab es eine klare Grenze zwischen einer 'List' und einem' Stream'. Ich öffnete es, betätigte es und sammelte es. Jetzt gibt es eine Map, die für einen neuen Stream geöffnet wird, also habe ich mich gefragt, ob das mit einem anderen Ansatz möglich ist. –
Vielleicht wurde ich von meinem .NET-Hintergrund verwirrt. Dort können Sie beliebige Operationen an einem 'IEnumerable' durchführen und am Ende sammeln Sie Ihr Ergebnis über' ToList', 'ToArray',' ToDictionary' oder indem Sie darüber iterieren. –