// ============== new 两条源数据,value 值均为一个字,退出 list ==================
Map<String, Object> map1 = new HashMap<>();
map1.put("id", 1);
map1.put("name", "甲");
map1.put("age", 12);
map1.put("gender", "男");
Map<String, Object> map2 = new HashMap<>();
map2.put("id", 2);
map2.put("name", "乙");
map2.put("age", 13);
map2.put("gender", "女");
List<Map<String, Object>> sourceList = new ArrayList<>();
sourceList.add(map1);
sourceList.add(map2);
// ============== new 三条新带并入的数据,value 值均为两个字,退出 list ==================
Map<String, Object> newMap1 = new HashMap<>();
newMap1.put("id", 1);
newMap1.put("name", "甲");
newMap1.put("age", 10);
newMap1.put("birthday", "2011-09-29");
Map<String, Object> newMap2 = new HashMap<>();
newMap2.put("id", 2);
newMap2.put("name", "乙");
newMap2.put("age", 11);
newMap2.put("birthday", "2010-09-29");
Map<String, Object> newMap3 = new HashMap<>();
newMap3.put("id", 3);
newMap3.put("name", "丙");
newMap3.put("age", 19);
newMap3.put("birthday", "2002-09-29");
List<Map<String, Object>> newList = new ArrayList<>();
newList.add(newMap1);
newList.add(newMap2);
newList.add(newMap3);
/**
* sourceList 有两条数据,newList 有三条数据
* 咱们想要的成果是将两个 mapList 合并,尽量保留各自所有数据,遇到 id 雷同的 map 则合并,* 当呈现其余 key 雷同的状况时,sourceList 中有值就优先用 sourceList 中的值,* 如果同一个 key,sourceList 的值为空,此时再用 newList 中的值
* (下面例子中 name 和 age 是 key 抵触的,name 两个 list 均雷同,但 age 不同)
* 并且最终合并成一个 mapList,达到如下成果:* [{"birthday":"2011-09-29","gender":"男","name":"甲","id":1,"age":12},
* {"birthday":"2010-09-29","gender":"女","name":"乙","id":2,"age":13},
* {"birthday":"2002-09-29","name":"丙","id":3,"age":19}]
*/
// 个别理论开发中后面的两个 List 都是数据库查问进去而不是手动 new 进去的,就可能会有 List 为空的状况,为防止空指针异样不能间接用 sourceList 来 addAllnewList
// 所以这里要手动 New 一个合并的 list
List<Map<String, Object>> list = new ArrayList<>();
list.addAll(sourceList);
list.addAll(newList);
// 合并
List<Map<String,Object>> combine = list.stream()
.collect(Collectors.groupingBy(group -> group.get("id").toString())) // 依据 map 中 id 的 value 值进行分组, 这一步的返回后果 Map<String,List<Map<String, Object>>>
.entrySet() // 失去 Set<Map.Entry<String, List<Map<String, Object>>>
.stream()
.map(m -> { // 进入映射环境
// m.getValue() 的后果是 List<Map<String, Object>>
Map<String, Object> collect = m.getValue().stream()
// o.entrySet() 的后果是 Set<Map.Entry<String, Object>>
.flatMap(o -> o.entrySet().stream()).filter(e -> e.getValue() != null)// 过滤下,value 须要是不为空的,否则报错
// (m1, m2) -> m1 的意思是如果 key 雷同 m1 == m2 则 value 应用 m1(此处为 sourceList 中的值).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (m1, m2) -> m1
));
return collect;
}).sorted(Comparator.comparing(m -> m.get("id").toString())).collect(Collectors.toList());
System.out.println(JSON.toJSONString(combine));
本文相干参考链接:https://segmentfault.com/q/1010000010380854