Java之List<Map<String,Object>>去重合并

下面就如何对两个List<Map<String,Object>>列表进行去重合并进行记录分享。

public static void main(String[] args) {
Map<String,Object> one = new HashMap<>();
        one.put("id","001");
        one.put("name","曹操");
        one.put("sex","mail");
        Map<String,Object> one2 = new HashMap<>();
        one2.put("id","002");
        one2.put("name","孙权");
        one2.put("sex","mail");
        Map<String,Object> one3 = new HashMap<>();
        one3.put("id","003");
        one3.put("name","刘备");
        one3.put("sex","mail");
        List<Map<String,Object>> listA = new ArrayList<>();
        listA.add(one);
        listA.add(one2);
        listA.add(one3);

        Map<String,Object> two = new HashMap<>();
        two.put("id","001");
        two.put("age",30);
        Map<String,Object> two2 = new HashMap<>();
        two2.put("id","002");
        two2.put("age",31);
        Map<String,Object> two3 = new HashMap<>();
        two3.put("id","003");
        two3.put("age",32);
        List<Map<String,Object>> listB = new ArrayList<>();
        listB.add(two);
        listB.add(two2);
        listB.add(two3);

        // 合并
        listB.addAll(listA);
        listB.forEach(System.out::println);
        //去重
        List<Map<String,Object>> result = listB.stream()
                .collect(Collectors.groupingBy(group -> group.get("id").toString()))//根据map中id的value值进行分组, 这一步的返回结果Map<String,List<Map<String, Object>>>
                .entrySet()//得到Set<Map.Entry<String, List<Map<String, Object>>>
                .stream()
                .map(map -> {
                    Map<String,Object> collect = map.getValue().stream()//m.getValue()的结果是 List<Map<String, Object>>
                            .flatMap(o -> o.entrySet().stream())//o.entrySet() 的结果是 Set<Map.Entry<String, Object>>
                            .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(m1,m2) -> m2));//(m1, m2) -> m2 的意思是如果 m1 == m2 则使用m2
                    return collect;
                })
                .collect(Collectors.toList());
        System.out.println(result);

}

结果如下:

{id=001, age=30}
{id=002, age=31}
{id=003, age=32}
{sex=mail, name=曹操, id=001}
{sex=mail, name=孙权, id=002}
{sex=mail, name=刘备, id=003}
[{sex=mail, name=曹操, id=001, age=30}, {sex=mail, name=孙权, id=002, age=31}, {sex=mail, name=刘备, id=003, age=32}]

可见,根据id成功将两个list进行去重合并。
封装成工具类

public class ListUtil {
    public static List<Map<String, Object>> merge(List<Map<String, Object>> m1, List<Map<String, Object>> m2, String key){
        m1.addAll(m2);
        Set<String> set = new HashSet<>();
        return m1.stream()
                .collect(Collectors.groupingBy(o->{
                    //暂存所有key
                    set.addAll(o.keySet());
                    //按id分组
                    return o.get(key);
                })).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());
    }
}

结果如下:

[{sex=mail, name=曹操, id=001, age=30}, {sex=mail, name=孙权, id=002, age=31}, {sex=mail, name=刘备, id=003, age=32}]
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值