从 JSON 数组中获取 Map<String、Map<String、List>> 形式的映射对象<SalaryMapper>



有一个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)));

根据上面的数据,contractidInteger类型,payrolltypeString类型,更多的例子可以在这里找到

对于你的问题,简单的回答如下:

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

最新更新