如何将JSON数组转换为Map<String, Map<String, List<SalaryMapper>>>格式
实现二级分组:Map<String, Map<String, List>>
问题背景
给定如下修正语法后的JSON数据:
[ { "contracted": 1, "payrolltype": "basicsalary", "otherdata": "sampledata", "salary": 1000 }, { "contracted": 1, "payrolltype": "basicsalary", "otherdata": "sampledata", "salary": 1001 }, { "contracted": 2, "payrolltype": "basicsalary", "otherdata": "sampledata", "salary": 10002 }, { "contracted": 1, "payrolltype": "addon", "otherdata": "sampledata", "salary": 1004 } ]
需要将其转换为Map<String, Map<String, List<SalaryMapper>>>结构,即先按contractId分组,再对每组内的数据按payrollType二次分组。
方案一:直接用Stream多级分组(推荐)
无需先做一次分组再遍历,通过嵌套Collectors.groupingBy一步完成二级分组,代码简洁高效:
List<SalaryMapper> salMap = myArray; Map<String, Map<String, List<SalaryMapper>>> result = salMap.stream() // 第一级分组:按contractId作为外层Map的key .collect(Collectors.groupingBy( SalaryMapper::getContractId, // 第二级分组:对每组内的数据按payrollType作为内层Map的key Collectors.groupingBy(SalaryMapper::getPayrollType) ));
外层Map的key为contractId,内层Map的key为payrollType,对应的值是同一contractId和payrollType下的SalaryMapper列表。
方案二:基于已有分组结果遍历处理
如果已完成按contractId的一级分组,可通过遍历完善二级分组逻辑,注意要正确初始化目标Map避免空指针:
// 假设已完成一级分组的map Map<String, List<SalaryMapper>> map = salMap.stream().collect(Collectors.groupingBy(SalaryMapper::getContractId)); // 初始化目标二级分组Map,不能为null Map<String, Map<String, List<SalaryMapper>>> subMap = new HashMap<>(); for (Map.Entry<String, List<SalaryMapper>> entry : map.entrySet()) { String contractId = entry.getKey(); List<SalaryMapper> salaryList = entry.getValue(); // 对当前contractId下的列表按payrollType分组 Map<String, List<SalaryMapper>> payrollGroup = salaryList.stream() .collect(Collectors.groupingBy(SalaryMapper::getPayrollType)); // 将二级分组结果存入目标Map subMap.put(contractId, payrollGroup); } return subMap;
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

