Merge Map<String, List<String> Java 8 Stream
Ich würde gerne Zusammenführen von zwei Anzeigen mit JAVA 8 Stream:
Map<String, List<String>> mapGlobal = new HashMap<String, List<String>>();
Map<String, List<String>> mapAdded = new HashMap<String, List<String>>();
Ich versuche, mit dieser Umsetzung:
mapGlobal = Stream.of(mapGlobal, mapAdded)
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())
));
Jedoch, diese Umsetzung nur ein Ergebnis erstellen, wie:
Map<String, List<Object>>
Wenn ein Schlüssel ist nicht enthalten in der mapGlobal
es würde Hinzugefügt werden, sobald Sie einen neuen Schlüssel mit der entsprechenden Liste von String. Wenn der Schlüssel dupliziert wird in mapGlobal
und mapAdded
sowohl die Liste der Werte zusammenfassen als: A = {1, 3, 5, 7}
und B = {1, 2, 4, 6}
dann A ∪ B = {1, 2, 3, 4, 5, 6, 7}
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies durch Iteration über alle Einträge in
mapAdded
und fasst Sie inmapGlobal
.Den folgenden iteriert über die Einträge von
mapAdded
durch den AufrufforEach(action)
, wo die Aktion verbraucht den Schlüssel und den Wert jedes Eintrags. Für jeden Eintrag, wir nennenmerge(Schlüssel, Wert, remappingFunction)
aufmapGlobal
: entweder erstellen Sie den Eintrag unter dem Schlüsselk
und Wertv
wenn der Schlüssel nicht vorhanden, oder es wird aufgerufen, der angegebene remapping Funktion, wenn Sie bereits existierten. Diese Funktion nimmt 2 Listen zu verschmelzen, was in diesem Fall sind zunächst HinzugefügtTreeSet
um sicherzustellen, dass die einzigartige und sortiert Elemente umgewandelt und wieder in eine Liste:Wenn Sie ausführen möchten, die möglicherweise parallel, Sie können erstellen einer Stream-pipeline, durch die sich die
entrySet()
und ruftparallelStream()
auf Sie. Aber dann, Sie brauchen, um stellen Sie sicher, dass Sie eine Karte, die unterstützt Parallelität fürmapGlobal
, wie einConcurrentHashMap
.mapGlobal
ist einConcurrentMap
, mutiert es von innen ein paralleler stream ist nicht sicher.ConcurrentHashMap
.Mittels foreach über die Karte können verwendet werden, um Zusammenführen gegeben arraylist.
Den ursprünglichen Implementierung nicht erstellen Ergebnis wie
Map<String, List<Object>>
, aberMap<String, List<List<String>>>
. Sie benötigen zusätzliche Stream pipeline auf es zu produzierenMap<String, List<String>>
.