有一个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
排列数据,并将List of Object映射为contractId
字段常见的对象。
为此,我使用java流如下所示:
List<SalaryMapper> salMap = myArray;
Map<String, List<SalaryMapper>> map = salMap.stream().collect(Collectors.groupingBy(SalaryMapper::getContractId));
现在我得到了由contractId
分组的结果。我正试图通过payrollType
:Map<contractId, Map<payrollType, List<SalaryMapper>>>
将地图分组到另一个级别。
为此,我试图迭代主地图并将其推到Map<contractId, Map<payrollType, List<SalaryMapper>>>
对象,但我在这里迷路了。
Map<String, Map<String,List<SalaryMapper>>> subMap = null;
Map<String,List<SalaryMapper>> newMapForPayrollType = null;
for(Map.Entry<String, List<SalaryMapper>> entry : map.entrySet()) {
}
return subMap;
您可以通过向下游传递Collector
来实现嵌套级groupingBy
Map<Integer, Map<String, List<SalaryMapper>>> map = salMap.stream()
.collect(Collectors.groupingBy(SalaryMapper::getContractId,
Collectors.groupingBy(SalaryMapper::getPayrollType)));
根据上面的数据,contractid
是Integer
类型,payrolltype
是String
类型,更多的例子可以在这里找到
对于你的问题,简单的回答如下:
Map<String, Map<String, List<SalaryMapper>>> subMap = new HashMap<>();
for (SalaryMapper sal: salMap) {
Map<String, List<SalaryMapper>> payrollTypeMap = new HashMap<>();
if (subMap.containsKey(sal.getContractId()) {
payrollTypeMap = subMap.get(sal.getContractId());
if (payrollTypeMap.containsKey(sal.getPayrollType())) {
payrollTypeMap.put(sal.getPayrollType(), payrollTypeMap.get(sal.getPayrollType()).add(sal));
} else {
payrollTypeMap.put(sal.getPayrollType(), new ArrayList<>(){{add(sal);}};
}
} else {
payrollTypeMap.put(sal.getPayrollType(), new ArrayList<>(){{add(sal);}};
}
subMap.put(sal.getContractId(), payrollTypeMap);
}
以上代码可以用更少的代码行进行优化和编写,如下所示:
Map<Integer, Map<String, List<SalaryMapper>>> subMap = salMap.stream()
.collect(Collectors.groupingBy(SalaryMapper::getContractId,
Collectors.groupingBy(SalaryMapper::getPayrollType)));