通过转换将 groupBy 流式传输到嵌套地图

Stream groupBy to nested maps with casting

需要根据以下嵌套地图结构按性别计算总数。但是由于存储为 Object 的数据需要在每次迭代时都进行转换。分组后无法转换最后一个叶子 Map 来计算和过滤日期对象。

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
 */

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

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

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()));