2015-07-31 81 views
6

Próbuję użyć strumienia List<Map<String, Integer>>, aby scalić wszystkie zawarte w nim mapy w jeden. Służy to agregacji wielu odpowiedzi na żądanie w jeden.Strumienie Java 8 - łączenie listy map

Rozważmy następujący zestaw danych (za pomocą JSON aby ułatwić odczyt):

[ 
    {"field1": 1, "field2": 5}, 
    {"field2": 6, "field3": 10}, 
    {"field1": 3, "field4": 15} 
] 

chcę go prowadzić w następujący (aby nie nie materia):

{"field1": 4, "field2": 11, "field3": 10, "field4": 15} 

I chcesz zsumować wszystkie klucze i połączyć je w jedną mapę. Czy można to zrobić za pomocą interfejsu Stream w Java 8?

Odkryłem Collectors.groupingBy(o -> o, Collectors.counting()), więc być może jestem na właściwej linii, po prostu muszę wymyślić, jak faktycznie połączyć je z góry bez pomijania wyników.

Z góry dziękuję.

Odpowiedz

13

counting() po prostu zwróci liczbę wartości zgrupowanych według funkcji zastosowanej do każdego klawisza. Jeśli chcesz je podsumować, dalszy kolektor szukasz jest summingInt (lub summingLong jeśli można mieć przepełnienia):

import static java.util.stream.Collectors.groupingBy; 
import static java.util.stream.Collectors.summingInt; 

... 

Map<String, Integer> map = 
    list.stream() 
     .flatMap(m -> m.entrySet().stream()) 
     .collect(groupingBy(Map.Entry::getKey, summingInt(Map.Entry::getValue))); 
+2

znacznie prostsze niż to, co pierwotnie wysłane. – rgettman

Powiązane problemy