首页 > 解决方案 > 通过强制转换将 groupBy 流式传输到嵌套地图

问题描述

需要从嵌套地图的下面结构中按性别计算总数。但是作为存储的数据Object需要在每次迭代时对其进行转换。分组后无法投射最后一片叶子地图来计算和过滤日期对象。

Map<String, Object> total = new HashMap<>();
Map<String, Object> mass = new HashMap<>();
Map<String, Object> ny = new HashMap<>();
Map<String, Object> male = new HashMap<>();
male.put("2021", 17);
male.put("2020", 98);
male.put("lastdate", new Date());
Map<String, Object> female = new HashMap<>();
female.put("2021", 12);
female.put("2020", 87);
female.put("lastdate", new Date());
mass.put("male", male);
mass.put("female", female);
ny.put("male", male);
ny.put("female", female);
total.put("MA", mass);
total.put("NY", ny);

应用于以下流,

Object mm = total.values().stream().map(x -> (Map<String, Object>) x)
            .map(Map::entrySet).flatMap(Collection::stream)
            .collect(
                    Collectors.groupingBy(Map.Entry::getKey),
                    Collectors.toMap(x -> (Map<String, Object>) x) // Not Working both toMapping() too
            );

/*
Final required output as Map
male=115
female=99
 */

标签: javajava-streamjava-9

解决方案


这是一种相当不寻常的数据存储方式。我建议您实施适当的类,例如具有适当领域的人,如性别、年龄、体重等。

但是如果你想坚持你的数据结构,下面的东西应该可以工作:

Map<String,Integer> result =
total.values()
        .stream()
        .map(e -> (Map<String,Object>) e)
        .findAny()
        .get()
        .entrySet()
        .stream()
        .collect(
                Collectors.toMap(Map.Entry::getKey,
                        m -> ((Map<String,Object>) m.getValue()).values()
                                .stream()
                                .filter(Integer.class::isInstance)
                                .mapToInt(Integer.class::cast)
                                .sum()));

推荐阅读