如何解开List <map>,按Map键分组和按Map值减少

时间:2019-04-08 05:38:11

标签: java list dictionary java-8 java-stream

我有一个List<Map<String, Double>>,代表一些计算,这些计算由“ {category””存储在Map键中。

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

我想按“类别”来计算平均值,例如:{a: 2.5 , b: 3.5}

我尝试过类似的东西

.collector(Collectors.groupingBy..)

但是第一个参数要求提供判别函数,我不知道该如何从Map项目中获取它。

有人知道如何用Java8做到这一点吗?谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用flatMap将所有地图的所有条目提取到一个Stream中。然后,您可以通过键将它们分组并计算出平均值。

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

答案 1 :(得分:2)

您可以将Collectors.averagingDouble用作下游

return listOfMap.stream()
        .flatMap(a -> a.entrySet().stream())
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                Collectors.averagingDouble(Map.Entry::getValue)));