一、开发场景
1.我需要统计支出明细、对于支出明细有两张表 一张是交易表 一张是房租支出表
2.根据需求我可以从两张表中分别查到符合要求的数据并拿到两个list
3.将两个list分别转换为map key是日期 格式为yyyyMMdd value是Bigdecimal类型的金额
4.需要将两个map相合并,日期相同的金额相加
1.方法一(传统的map遍历)
public static void main(String[] args) {
Map<String, Bigdecimal> map1 = new HashMap<>();
map1.put("20230101", 100);
map1.put("20230201", 200);
map1.put("20230301", 300);
Map<String, Bigdecimal> map2 = new HashMap<>();
map2.put("20230201", 150);
map2.put("20230301", 250);
map2.put("20230401", 350);
Map<String, Bigdecimal> mergedMap = mergeMaps(map1, map2);
for (Map.Entry<String, Integer> entry : mergedMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
public static Map<String, Bigdecimal> mergeMaps(Map<String, Bigdecimal> map1, Map<String, Integer> map2) {
Map<String, Bigdecimal> mergedMap = new HashMap<>();
for (Map.Entry<String, Integer> entry : map1.entrySet()) {
mergedMap.put(entry.getKey(), entry.getValue());
}
for (Map.Entry<String, Bigdecimal> entry : map2.entrySet()) {
if (mergedMap.containsKey(entry.getKey())) {
mergedMap.put(entry.getKey(), mergedMap.get(entry.getKey()) .add( entry.getValue()));
} else {
mergedMap.put(entry.getKey(), entry.getValue());
}
}
return mergedMap;
}
2.方法二(stream流搞定)
Map<String, BigDecimal> collect4 = Stream.concat(collect1.entrySet().stream(), collect3.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1.add(v2)));