兩個List快速合併

在日常的開發中經常遇見需要對兩個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());
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章