java 利用lambda 将两个list<map<String,object>>按照两个list中map的一列值合并

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

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

最后合并的list中map,包含a_id,in_num,out_num,两个list中相同的a_id合并,不同的补0
相当于结果长度为4

        a_id  in_num  out_num
第一行    1      10      20
第二行    2       0      20
第三行    3      10      20
第四行    4      10       0
阅读 13.2k
1 个回答

有点长但还算完整

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("a_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());
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题