1. map1中累加map2中某个指定key的值(针对数值类型)
(1)如果map1中不存在key对应的值,则把map2中对应key的值添加进map1中;
(2)否则,map1中存在的值,和map2中存在的值,进行累加。代码如下所示:
public static void addMapSameKey(Map<String, Object> map1, Map<String, Object> map2, String key) {
if (map1.get(key) == null) {
// 如果map1 中,指定的key值为空的时候,赋值为map2中对应的的key值元素。
map1.put(key, map2.get(key));
} else {
// 否则,累加map2中对应的key值元素到map1.
BigDecimal d1 = new BigDecimal(map1.get(key).toString());
BigDecimal d2 = new BigDecimal(map2.get(key) == null ? "0" : map2.get(key).toString());
map1.put(key, d1.add(d2));
}
}
(3)适用场景
该方法对map的累加进行了抽象,抽象后,可以作为一个基本的累加单元。
2. map中拷贝累加listMap中各属性的值
(1)map中的keyList分为三类:第一类是忽略的key列表,第二类是拷贝属性的key列表,第三类是除了前两类,数值类型的需要累加的key列表;
(2)对拷贝源的sourceList进行遍历;对每一个拷贝源map,亦进行key的遍历;
(3)进行判断,如果key值在拷贝列表里面,则执行拷贝操作;否则,如果也不在忽略列表里面,则执行累加操作。代码如下所示:
public static copyAddListMap2Map(Map<String,Object> destMap, List<Map<String, Object>> sourceList, List<String> ignoreList, List<String> copyList) {
for (Map<String, Object> item : sourceList) {
for (Map.Entry<String, Object> entry : item.entrySet()) {
final String key = entry.getKey();
if (copyList != null && copyList.contains(key)) {
destMap.put(key, item.get(key));
} else if (!(ignoreList != null && ignoreList.contains(key))) {
addMapSameKey(destMap, item, key);
}
}
}
}
(4)适用场景
如果在sql中执行了查询后,需要在java后台附加统计汇总信息,则可以使用该方法,完成listMap的统计汇总。统计后,合并listMap和map即可。
3. listMap树结构累加求和
(1)list是Map的集合;Map中,又包括有children为key的listMap集合;
(2)对list集合进行遍历;对每一个map,判断该map是否存在children的listMap集合;如果存在,则执行map集合对ListMap的属性拷贝和累加。
(3)需要注意的是,忽略列表和属性拷贝列表。代码如下所示:
public static void copyAddListMapChild2Parent(List<Map<String, Object>> list, List<String> ignoreList, List<String> copyList) {
for (Map<String, Object> item : list) {
// 如果子节点存在,则对应节点的属性,等于子节点列表对应的属性的和。
if (item.get("children") != null) {
List<Map<String, Object>> childList = (List<Map<String, Object>>) item.get("children");
// 子节点列表属性之和,拷贝到对应的父节点。
copyAddListMap2Map(item,childList,ignoreList,copyList);
}
}
}
(4)适用场景,java后台中,需要对树形结构进行汇总的情况。
(好记性不如烂笔头。对抗遗忘的最好方式是:在解决问题的时候,记录下遇到的问题和解决的方式,后续遇到相同的问题,只需要翻翻笔记即可。)