Java 8 stream aggregate-eine Karte
Ich versuche, etwas zu tun, was scheinbar unkompliziert, aber ohne Glück so weit. Ich habe eine Liste von Karte, Sie kommen aus einer Reihe von CompletableFutures parallel, das Ergebnis hat dann zusammengefügt werden. Da der key in der map ist einzigartig, Im Zusammenführen müssen die Werte und erzeugt eine neue Karte von eindeutigen Schlüsseln im Zusammenhang mit der kombinierten Liste von SomeType. Zum Beispiel:
Karte 1:
key1 : Sometype1
key2 : Sometype2
Map2
key1 : Sometype3
key2 : Sometype4
Gewünschte Ergebnis:
Karte 3:
key1 : Sometype, Sometype3
key2 : Sometype2, Sometype4
Versuchte ich mit groupBy-und andere Methoden, aber es scheint, die meisten von Ihnen annehmen, Sie arbeiten mit einer Liste und nicht eine Karte, mit zu beginnen, so war ich nicht in der Lage zu finden, eine einfache Möglichkeit, es zu tun.
Bisher habe ich so etwas wie:
Map<String, List<Sometype>> volPercent = waitGroup.stream()
.map(CompletableFuture::join)
.flatMap((e) -> e.entrySet().stream())
.collect(Collectors.groupingBy());
Den Teil, den ich bin mir nicht sicher, was gehen muss, in der Gruppierung Teil. Ich habe versucht, Anzeigen.Eintrag::getKey, es aber nicht kompilieren:
Error:(69, 25) java: incompatible types: inference variable T has incompatible bounds
equality constraints: com.Sometype
lower bounds: java.util.Map.Entry<java.lang.String,com.Sometype>
- Bitte konstruieren Sie eine kleine runnable Beispiel für dein problem, es ist schwer zu lösen, nur mit dem stream Zeile code.
- Die upstream -
CompletableFuture
Zeug ist ein bisschen eine Ablenkung. Es wäre gut für die Fragen der Zukunft zu beginnen, mit etwas mehr explizite Eingaben. Aber ich glaube, ich war in der Lage, um es herauszufinden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich davon ausgehen, dass Sie sind, beginnend mit einem Strom von Karten:
Du hast ziemlich weit mit dem flatmapping und sammeln. Aber der code, den Sie versucht,
gibt eine map, deren Schlüssel sind
String
und deren Werte eine Liste von anzeigen Einträge, speziellList<Map.Entry<String,Sometype>>
, nicht einList<Sometype>
wie Sie wollte. Was Sie tun müssen ist, verwenden Sie die "downstream" - Funktion von Sammlern, nachdem Sie geordnet Schlüssel. Sie wollen nehmen Sie jedeMap.Entry
und entpacken (map), die es Ihr Wert, was istSometype
. Dies geschieht mit einemmapping
Sammler.Nun Sie möglicherweise mehrere Instanzen von
Sometype
für jede Taste, so müssen Sie sammeln Sie in einer Liste. Dies geschieht mit Hilfe anderen downstream-Sammler, der sammelt Sie in einer Liste. Dies geschieht mit Hilfe der bekanntentoList()
Sammler.Der endgültige code sieht wie folgt aus:
Das problem ist, dass Ihre erste Versuch (wie ich es verstehe)
sammelt, zu einer
Map<K, List<Map.Entry<K, V>>>
.Nach der
flatMap
Sie haben eineStream<Map.Entry<K, V>>
deren ElementegroupingBy
Karten zuK
.Aber Sie wollen eine
Map<K, List<V>>
so müssen Sie diegroupingBy
, das dauert ein downstream-Kollektor, nicht nur ein Klassifikator, so können Sie auch die KarteMap.Entry<K, V>
zuV
.Etwas wie