在日常的开发中经常遇见需要对两个List<Map<String,Object>>合并后的数据进行处理,常用的方法无非是各自for循环再合并成一个新的List<Map<String,Object>>,不论效率还是业务上都非常复杂。
针对此情况,利用Java 8 Lambda可以快速将两个List<Map<String,Object>>合并,还可以对list排序
话不多说,直接上代码
public static void main(String[] args) {
List<Map<String, Object>> list1 = new ArrayList<>();
List<Map<String, Object>> list2 = new ArrayList<>();
Map map1 = new HashMap();
Map map2 = new HashMap();
Map map3 = new HashMap();
Map map4 = new HashMap();
map1.put("id",1);
map1.put("name","张三");
map2.put("id",2);
map2.put("name","李四");
map3.put("id",3);
map3.put("name","王五");
map4.put("id",4);
map4.put("name","赵六");
list1.add(map1);
list1.add(map2);
list2.add(map3);
list2.add(map4);
System.out.println("lsit1是"+list1);
结果:lsit1是[{name=张三, id=1}, {name=李四, id=2}]
System.out.println("list2是"+list2);
结果:list2是[{name=王五, id=3}, {name=赵六, id=4}]
List<Map<String, Object>> newList = ListUtil.merge(list1,list2);
System.out.println("新的List<Map>是"+newList);
结果:新的List<Map>是[{name=张三, id=1}, {name=李四, id=2}, {name=王五, id=3}, {name=赵六, id=4}]
public class ListUtil {
public static List<Map<String, Object>> merge(List<Map<String, Object>> m1, List<Map<String, Object>> m2){
m1.addAll(m2);
Set<String> set = new HashSet<>();
return m1.stream()
.collect(Collectors.groupingBy(o->{
//暂存所有key
set.addAll(o.keySet());
//按a_id分组
return o.get("id");
})).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());
}