在实际项目开发过程中,循环操作可以说是最基本的处理数据的方式之一。但是对于初学者或者设计不合理的业务就会产生嵌套循环甚至多层深度循环,先不讨论执行效率如何,首先得想想业务这样实现真的合理吗?
其实循环操作无非就是处理数据结构,通过equals比较去设置对应属性或者做动态计算,因此可以考虑尽量转换成map结构去做相应处理。
1.例如存在如下两个数据集,需要动态合并计算月数据和当前数据;
//查询月统计数据
List<CheckupInputInfo> defaultCheckList=checkupInputInfoMapper.getCheckupInputList(params);
//查询截止目前的统计数据
List<CheckupInputInfo> currentCheckList=checkupInputInfoMapper.getCurrentDataList(params);
2.将对应的list转成map数据结构,具体案例请看如下:
//动态数据转换
Map<String,CheckupInputInfo> defaultCheckMap
= defaultCheckList.stream().collect(Collectors.toMap(CheckupInputInfo::getStationName, Function.identity()));
Map<String,CheckupInputInfo> currentCheckMap
= currentCheckList.stream().collect(Collectors.toMap(CheckupInputInfo::getStationName, Function.identity()));
//因为需要动态补全缺失的审查数据,不能直接使用map作为循环变量
List<String> staNameList = staList.stream().map(SysDept::getStaName).collect(Collectors.toList());
3.最后只需要一次遍历循环,避免了多层循环和判断,即可动态获取不同结构的数据,使用map最大的好处就是效率高,速度快。
//最终需要的数据结果
List<CheckupInputInfo> gatherCheckUpList = new ArrayList<>();
CheckupInputInfo singleCheckup = null;
for (String staStr : staNameList) {
singleCheckup = new CheckupInputInfo();
if(defaultCheckMap.containsKey(staStr)){
singleCheckup = defaultCheckMap.get(staStr);
singleCheckup.setCurrentSum(currentCheckMap.get(staStr).getCountNum());
}else {
singleCheckup.setStationName(staStr);
singleCheckup.setCheckupNum(sysDeptMap.get(staStr).getStaCheckupNum());
if(currentCheckMap.containsKey(staStr)){
singleCheckup.setCurrentSum(currentCheckMap.get(staStr).getCountNum());
}else {
singleCheckup.setCurrentSum(0);
}
singleCheckup.setCountNum(0);
singleCheckup.setRatio(BigDecimal.ZERO);
}
gatherCheckUpList.add(singleCheckup);
}