如何在java 8中展平地图列表

use*_*328 5 java lambda java-8

我有要求我有地图列表

[{Men=1},{Men=2, Women=3},{Women=2,Boys=4}]
Run Code Online (Sandbox Code Playgroud)

现在我需要使它成为一个flatMap,看起来像

Gender=countOfValues
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,输出将是

{Men=3,Women=5,Boys=4}
Run Code Online (Sandbox Code Playgroud)

目前我有以下代码:

private Map<String, Long> getGenderMap(
        List<Map<String, Long>> genderToCountList) {
    Map<String, Long> gendersMap = new HashMap<String, Long>();
    Iterator<Map<String, Long>> genderToCountListIterator = genderToCountList
            .iterator();
    while (genderToCountListIterator.hasNext()) {
        Map<String, Long> genderToCount = genderToCountListIterator.next();
        Iterator<String> genderToCountIterator = genderToCount.keySet()
                .iterator();
        while (genderToCountIterator.hasNext()) {
            String gender = genderToCountIterator.next();
            if (gendersMap.containsKey(gender)) {
                Long count = gendersMap.get(gender);
                gendersMap.put(gender, count + genderToCount.get(gender));
            } else {
                gendersMap.put(gender, genderToCount.get(gender));
            }
        }
    }
    return gendersMap;
}
Run Code Online (Sandbox Code Playgroud)

我们如何使用lambda表达式使用Java8编写这段代码?

Pau*_*ton 16

我不会为此使用任何lambda,但我已经使用Map.merge了Java 8中引入的方法引用.

Map<String, Long> result = new HashMap<>();
for (Map<String, Long> map : genderToCountList)
    for (Map.Entry<String, Long> entry : map.entrySet())
        result.merge(entry.getKey(), entry.getValue(), Long::sum);
Run Code Online (Sandbox Code Playgroud)

您也可以使用Streams 执行此操作:

return genderToCountList.stream().flatMap(m -> m.entrySet().stream())
           .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Long::sum));
Run Code Online (Sandbox Code Playgroud)