码迷,mamicode.com
首页 > 编程语言 > 详细

java8 stream 融汇实战

时间:2019-12-26 21:23:49      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:under   ora   text   array   flat   out   list   shm   str   

 

 

 

//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}]

java8 stream 融汇实战

标签:under   ora   text   array   flat   out   list   shm   str   

原文地址:https://www.cnblogs.com/hahajava/p/12104334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!