Java|Java 8 Stream根据某个相同的key合并两个Map List,其他key相同时优先保留其中一个List的值

【Java|Java 8 Stream根据某个相同的key合并两个Map List,其他key相同时优先保留其中一个List的值】// ============== new两条源数据,加入list ==================

Map map1 = new HashMap<>(); map1.put("id", 1); map1.put("name", "甲"); map1.put("age", 12); map1.put("gender", "男"); Map map2 = new HashMap<>(); map2.put("id", 2); map2.put("name", "乙"); map2.put("age", 13); map2.put("gender", "女"); List sourceList = new ArrayList<>(); sourceList.add(map1); sourceList.add(map2); // ============== new三条新带并入的数据,加入list ================== Map newMap1 = new HashMap<>(); newMap1.put("id", 1); newMap1.put("name", "甲"); newMap1.put("age", 10); newMap1.put("birthday", "2011-09-29"); Map newMap2 = new HashMap<>(); newMap2.put("id", 2); newMap2.put("name", "乙"); newMap2.put("age", 11); newMap2.put("birthday", "2010-09-29"); Map newMap3 = new HashMap<>(); newMap3.put("id", 3); newMap3.put("name", "丙"); newMap3.put("age", 19); newMap3.put("birthday", "2002-09-29"); List newList = new ArrayList<>(); newList.add(newMap1); newList.add(newMap2); newList.add(newMap3); /** * sourceList有两条数据,newList有三条数据 * 我们想要的效果是将两个mapList合并,尽量保留各自所有数据,遇到id相同的map则合并, * 当出现其他key相同的情况时,sourceList中有值就优先用sourceList中的值, * 如果同一个key,sourceList的值为空,此时再用newList中的值 * (上面例子中name和age是key冲突的,name两个list均相同,但age不同) * 并且最终合并成一个mapList,达到如下效果: * [{"birthday":"2011-09-29","gender":"男","name":"甲","id":1,"age":12}, * {"birthday":"2010-09-29","gender":"女","name":"乙","id":2,"age":13}, * {"birthday":"2002-09-29","name":"丙","id":3,"age":19}] */ //一般实际开发中前面的两个List都是数据库查询出来而不是手动new出来的,就可能会有List为空的情况,为避免空指针异常不能直接用sourceList来addAll newList // 所以这里要手动New一个合并的list List list = new ArrayList<>(); list.addAll(sourceList); list.addAll(newList); //合并 List combine = list.stream() .collect(Collectors.groupingBy(group -> group.get("id").toString())) // 根据map中id的value值进行分组, 这一步的返回结果Map>> .entrySet() // 得到Set> .stream() .map(m -> { // 进入映射环境 // m.getValue()的结果是 List Map collect = m.getValue().stream() // o.entrySet() 的结果是 Set .flatMap(o -> o.entrySet().stream()).filter(e -> e.getValue() != null)//过滤下,value需要是不为空的,否则报错 // (m1, m2) -> m1 的意思是如果key相同 m1 == m2 则value使用m1(此处为sourceList中的值) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (m1, m2) -> m1 )); return collect; }).sorted(Comparator.comparing(m -> m.get("id").toString())).collect(Collectors.toList()); //打印输出看看 System.out.println(JSON.toJSONString(combine)); 本文相关参考链接:https://segmentfault.com/q/1010000010380854

    推荐阅读