2015-12-09 3 views
10

У меня есть список, как это:Группировка по Список Карта в Java 8

List<Map<String, Long>> 

Есть ли способ, с помощью лямбда, чтобы преобразовать этот список:

Map<String, List<Long>> 

Пример:

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); 

После форматирования:

Map<String, List<Long>> afterFormatting; 

, который будет выглядеть так:

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

ответ

10

Вы должны flatMap набор ввода каждой карты, чтобы создать Stream<Map.Entry<String, Long>>. Затем этот поток можно собрать с помощью коллектора groupingBy(classifier, downstream): классификатор возвращает ключ записи, а сборщик вниз по потоку сопоставляет запись с ее значением и собирает ее в List.

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

Этого код необходим следующий статический импорт:

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

С вашим полным, например:

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

Спасибо, Tunaki! :-) – test123

Смежные вопросы