如何从Stream收集嵌套Map:构建以出生日期为键的多层映射
构建嵌套分组Map
定义的Data类
public class Data { String name; String dateOfBirth; String dateAttendedClass; }
需求
现有一个Data类型的列表,需要构建如下结构的嵌套Map:
Map<String, Map<String, List<String>>> // 结构说明:Map<dateOfBirth, Map<name, list(dateAttendedClass)>>
已实现的代码
目前已经实现了按name分组,对应dateAttendedClass列表的Map:
Map<String, List<String>> nameAttendedClassMap = data.stream() .collect(Collectors.groupingBy(Data::getName, Collectors.mapping(Data::getDateAttendedClass, Collectors.toList())));
现在需要进一步构建以dateOfBirth为顶级键的嵌套Map。
解决方案
直接使用嵌套的groupingBy即可完成需求,外层按dateOfBirth分组,内层继续按name分组,同时指定内层的收集器为dateAttendedClass的列表:
Map<String, Map<String, List<String>>> dobNameAttendedMap = data.stream() .collect(Collectors.groupingBy( Data::getDateOfBirth, // 外层键:dateOfBirth Collectors.groupingBy( Data::getName, // 内层键:name Collectors.mapping(Data::getDateAttendedClass, Collectors.toList()) // 内层值:dateAttendedClass列表 ) ));
代码说明
- 外层
groupingBy(Data::getDateOfBirth):将所有Data对象先按dateOfBirth分组,每个分组对应一个子Map。 - 内层
groupingBy(Data::getName, ...):对每个dateOfBirth分组内的对象,再按name分组,每个name对应的是该用户所有的dateAttendedClass列表。
这样就能直接得到你需要的嵌套Map结构。
内容的提问来源于stack exchange,提问作者user3809938
相关产品推荐
相关产品推荐

