Как развернуть список <Map>, сгруппировать по ключам карты и уменьшить по значениям карты - PullRequest
4 голосов
/ 08 апреля 2019

У меня есть List<Map<String, Double>>, представляющий некоторые вычисления, которые хранятся в категории в ключе Map.

[{a: 1, b:2}, {a:4, b:5})

Я хочу вычислить среднее значение по категории, что-то вроде: {a: 2.5 , b: 3.5}.

Я пробовал что-то вроде

.collector(Collectors.groupingBy..)

но первый параметр запрашивает функцию распознавания, которую я не знаю, как выловить ее из элемента Map.

Есть идеи, как это сделать с Java8? Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Вы можете использовать Collectors.averagingDouble в качестве нисходящего

return listOfMap.stream()
        .flatMap(a -> a.entrySet().stream())
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                Collectors.averagingDouble(Map.Entry::getValue)));
2 голосов
/ 08 апреля 2019

Вы можете использовать flatMap, чтобы извлечь все записи всех карт в один Stream.Затем вы можете сгруппировать их по ключу и рассчитать среднее значение.

Map<String,Double> average =
    list.stream()
        .flatMap(m->m.entrySet().stream())
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                                       Collectors.averagingDouble(Map.Entry::getValue)));
...