java8 實戰--- Map merge用法


 

 

拓展鏈接: https://juejin.im/post/5d9b455ae51d45782b0c1bfb

 

//https://segmentfault.com/q/1010000019798265 java 利用lambda 將兩個list<map<String,object>>按照兩個list中map的一列值合並
    public static List<Map<String, Object>> merge(List<Map<String, Object>> list1, List<Map<String, Object>> list2) {

        list1.addAll(list2);
        Set<String> set_mark = new HashSet<>();

        Map<Object, List<Map<String, Object>>> step1_map1 = list1.stream()
                .collect(Collectors.groupingBy(temp1 -> {
                    set_mark.addAll(temp1.keySet());//暫存所有key
                    //按 a_id 分組
                    return temp1.get("a_id"); //根據 a_id 牽頭 生成新的 Map<Object, List<Map<String, Object>>>
                }));

        List<Map<String, Object>> res =
                step1_map1.entrySet().stream().map(mix -> {
                    //合並
                    Stream<Map.Entry<String, Object>> step2_entryStream =  //獲取 entrySet().stream()
                            mix.getValue().stream().flatMap(m -> {
                                return m.entrySet().stream();
                            });
                    Map<String, Object> step3_map = step2_entryStream  //將要return回去的 Map<String, Object>
                            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a, b) -> b));

                    //為沒有的key賦值0
                    set_mark.stream().forEach(k -> {
                        if (!step3_map.containsKey(k)) {
                            step3_map.put(k, 0);
                        }
                    });
                    return step3_map;
                }).collect(Collectors.toList());

        return res;
    }

 

 

 

 Map<String, Object> map1 = new HashMap<>();
        map1.put("a_id", 1);
        map1.put("in_num", 10);
        Map<String, Object> map2 = new HashMap<>();
        map2.put("a_id", 3);
        map2.put("in_num", 10);
        List<Map<String, Object>> list1 = new ArrayList<>();
        list1.add(map1);
        list1.add(map2);

        Map<String, Object> map4 = new HashMap<>();
        map4.put("a_id", 1);
        map4.put("out_num", 20);
        Map<String, Object> map5 = new HashMap<>();
        map5.put("a_id", 2);
        map5.put("out_num", 20);
        List<Map<String, Object>> list2 = new ArrayList<>();
        list2.add(map4);
        list2.add(map5);

        List<Map<String, Object>> merge = merge(list1, list2);
        System.out.println(merge);
        //[{a_id=1, in_num=10, out_num=20}, {a_id=2, in_num=0, out_num=20}, {a_id=3, in_num=10, out_num=0}]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM