在日常的開發中經常遇見需要對兩個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());
}