下面就如何对两个List<Map<String,Object>>列表进行去重合并进行记录分享。
public static void main(String[] args) {
Map<String,Object> one = new HashMap<>();
one.put("id","001");
one.put("name","曹操");
one.put("sex","mail");
Map<String,Object> one2 = new HashMap<>();
one2.put("id","002");
one2.put("name","孙权");
one2.put("sex","mail");
Map<String,Object> one3 = new HashMap<>();
one3.put("id","003");
one3.put("name","刘备");
one3.put("sex","mail");
List<Map<String,Object>> listA = new ArrayList<>();
listA.add(one);
listA.add(one2);
listA.add(one3);
Map<String,Object> two = new HashMap<>();
two.put("id","001");
two.put("age",30);
Map<String,Object> two2 = new HashMap<>();
two2.put("id","002");
two2.put("age",31);
Map<String,Object> two3 = new HashMap<>();
two3.put("id","003");
two3.put("age",32);
List<Map<String,Object>> listB = new ArrayList<>();
listB.add(two);
listB.add(two2);
listB.add(two3);
// 合并
listB.addAll(listA);
listB.forEach(System.out::println);
//去重
List<Map<String,Object>> result = listB.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(map -> {
Map<String,Object> collect = map.getValue().stream()//m.getValue()的结果是 List<Map<String, Object>>
.flatMap(o -> o.entrySet().stream())//o.entrySet() 的结果是 Set<Map.Entry<String, Object>>
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(m1,m2) -> m2));//(m1, m2) -> m2 的意思是如果 m1 == m2 则使用m2
return collect;
})
.collect(Collectors.toList());
System.out.println(result);
}
结果如下:
{id=001, age=30}
{id=002, age=31}
{id=003, age=32}
{sex=mail, name=曹操, id=001}
{sex=mail, name=孙权, id=002}
{sex=mail, name=刘备, id=003}
[{sex=mail, name=曹操, id=001, age=30}, {sex=mail, name=孙权, id=002, age=31}, {sex=mail, name=刘备, id=003, age=32}]
可见,根据id成功将两个list进行去重合并。
封装成工具类
public class ListUtil {
public static List<Map<String, Object>> merge(List<Map<String, Object>> m1, List<Map<String, Object>> m2, String key){
m1.addAll(m2);
Set<String> set = new HashSet<>();
return m1.stream()
.collect(Collectors.groupingBy(o->{
//暂存所有key
set.addAll(o.keySet());
//按id分组
return o.get(key);
})).entrySet().stream().map(o->{
//合并
Map<String, Object> map = o.getValue().stream().flatMap(m->{
return m.entrySet().stream();
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a,b)->b));
//为没有的key赋值0
set.stream().forEach(k->{
if(!map.containsKey(k)) {
map.put(k, 0);
}
});
return map;
}).collect(Collectors.toList());
}
}
结果如下:
[{sex=mail, name=曹操, id=001, age=30}, {sex=mail, name=孙权, id=002, age=31}, {sex=mail, name=刘备, id=003, age=32}]