2015-12-09 10 views
10

Ich habe eine Liste wie folgt aus:Gruppierung nach Liste der Karte in Java 8

List<Map<String, Long>> 

Gibt es eine Möglichkeit, Lambda verwenden, um diese Liste zu konvertieren:

Map<String, List<Long>> 

Beispiel:

Map<String, Long> m1 = new HashMap<>(); 
m1.put("A", 1); 
m1.put("B", 100); 

Map<String, Long> m2 = new HashMap<>(); 
m2.put("A", 10); 
m2.put("B", 20); 
m2.put("C", 100); 

List<Map<String, Long>> beforeFormatting = new ArrayList<>(); 
beforeFormatting.add(m1); 
beforeFormatting.add(m2); 

Nach der Formatierung:

Map<String, List<Long>> afterFormatting; 

, die aussehen würde:

A -> [1, 10] 
B -> [100, 20] 
C -> [100] 

Antwort

10

Sie den Eintrag Satz jeder Karte müssen flatMap eine Stream<Map.Entry<String, Long>> zu erstellen. Dann kann dieser Stream mit dem Collector groupingBy(classifier, downstream) gesammelt werden: Der Klassifikator gibt den Schlüssel des Eintrags zurück, und der nachgeordnete Collector bildet den Eintrag auf seinen Wert ab und sammelt diesen in eine List.

Map<String, List<Long>> map = 
    list.stream() 
     .flatMap(m -> m.entrySet().stream()) 
     .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList()))); 

Dieser Code benötigt folgende statische Importe:

import static java.util.stream.Collectors.groupingBy; 
import static java.util.stream.Collectors.mapping; 
import static java.util.stream.Collectors.toList; 

mit Ihrem vollständigen Beispiel:

public static void main(String[] args) { 
    Map<String, Long> m1 = new HashMap<>(); 
    m1.put("A", 1l); 
    m1.put("B", 100l); 

    Map<String, Long> m2 = new HashMap<>(); 
    m2.put("A", 10l); 
    m2.put("B", 20l); 
    m2.put("C", 100l); 

    List<Map<String, Long>> beforeFormatting = new ArrayList<>(); 
    beforeFormatting.add(m1); 
    beforeFormatting.add(m2); 

    Map<String, List<Long>> afterFormatting = 
     beforeFormatting.stream() 
         .flatMap(m -> m.entrySet().stream()) 
         .collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList()))); 

    System.out.println(afterFormatting); // prints {A=[1, 10], B=[100, 20], C=[100]} 
} 
+0

Danke, Tunaki! :-) – test123