通过转换将 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()));
需要根据以下嵌套地图结构按性别计算总数。但是由于存储为 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()));