java 8 怎么把三个list分组然后合并到一个list里面?

list1

{"hjje":"520.00","dan_no":"YSQ2022102"},{"hjje":"351.02","dan_no":"YSQ202206"}

list2

{"shum":"JAVA","dan_no":"YSQ202206"},{"shum":"C++","dan_no":"YSQ2022102"},{"shum":"PHP","dan_no":"YSQ202206"}

list3

{"nj":"三年级二班","dan_no":"YSQ202206"},{"nj":"二年级一班","dan_no":"YSQ2022102"},{"nj":"三年级四班","dan_no":"YSQ202206"},

java8 怎么把上面3个List根据dan_no分组,然后合并到一个List里面?
最终结果:


{"dan_no":"YSQ2022102","shum":"C++","nj":"二年级一班","hjje":"520.00"},{"dan_no":"YSQ202206","shum":"JAVA,PHP","nj":"三年级四班,三年级二班","hjje":"351.02"}

初学,请教。


public static void main(String[] args) {
        List<Map<String,String>> list1 = new ArrayList<>();
        Map<String,String> map11 = new HashMap();
        map11.put("hjje", "520.00");
        map11.put("dan_no", "YSQ2022102");

        Map<String,String> map12 = new HashMap();
        map12.put("hjje", "351.02");
        map12.put("dan_no", "YSQ202206");
        list1.add(map11);
        list1.add(map12);

        List<Map<String,String>> list2 = new ArrayList<>();
        Map<String,String> map21 = new HashMap();
        map21.put("shum", "JAVA");
        map21.put("dan_no", "YSQ202206");

        Map<String,String> map22 = new HashMap();
        map22.put("shum", "C++");
        map22.put("dan_no", "YSQ2022102");

        Map<String,String> map23 = new HashMap();
        map23.put("shum", "PHP");
        map23.put("dan_no", "YSQ202206");
        list2.add(map21);
        list2.add(map22);
        list2.add(map23);

        List<Map<String,String>> list3 = new ArrayList<>();
        Map<String,String> map31 = new HashMap();
        map31.put("nj", "三年级二班");
        map31.put("dan_no", "YSQ202206");

        Map<String,String> map32 = new HashMap();
        map32.put("nj", "二年级一班");
        map32.put("dan_no", "YSQ2022102");

        Map<String,String> map33 = new HashMap();
        map33.put("nj", "三年级四班");
        map33.put("dan_no", "YSQ202206");

        list3.add(map31);
        list3.add(map32);
        list3.add(map33);
        List<Map<String, String>> collect2 = list1.stream().map(m1 -> {
            List<String> collect = list2.stream().filter(f -> m1.get("dan_no").equals(f.get("dan_no"))).map(fe -> {
                String shum = fe.get("shum").toString();
                return shum;
            }).collect(Collectors.toList());
            String join = String.join(",", collect);
            m1.put("shum", join);

            List<String> collect1 = list3.stream().filter(f -> m1.get("dan_no").equals(f.get("dan_no"))).map(fe -> {
                String shum = fe.get("nj").toString();
                return shum;
            }).collect(Collectors.toList());
            String nj = String.join(",", collect1);
            m1.put("nj", nj);
            return m1;
        }).collect(Collectors.toList());
        System.out.println(collect2);
    }

参考代码


List<Map<String, Object>> result = list1.stream()
    .map(map1 -> list2.stream()
        .filter(map2 -> map2.get("dan_no").equals(map1.get("dan_no")))
        .map(map2 -> {
            Map<String, Object> map = new HashMap<>();
            map.putAll(map1);
            map.putAll(map2);
            return map;
        })
        .map(map -> list3.stream()
            .filter(map3 -> map3.get("dan_no").equals(map.get("dan_no")))
            .map(map3 -> {
                Map<String, Object> mapResult = new HashMap<>();
                mapResult.putAll(map);
                mapResult.putAll(map3);
                return mapResult;
            })
            .collect(Collectors.toList()))
        .flatMap(List::stream)
        .collect(Collectors.toList()))
    .flatMap(List::stream)
    .collect(Collectors.groupingBy(map -> map.get("dan_no"),
        Collectors.reducing(new HashMap<>(), (map1, map2) -> {
            Map<String, Object> resultMap = new HashMap<>();
            resultMap.put("dan_no", map1.get("dan_no"));
            resultMap.put("shum", map1.getOrDefault("shum", "") + "," + map2.getOrDefault("shum", ""));
            resultMap.put("nj", map1.getOrDefault("nj", "") + "," + map2.getOrDefault("nj", ""));
            resultMap.put("hjje", map1.getOrDefault("hjje", "") + "," + map2.getOrDefault("hjje", ""));
            return resultMap;
        }))).values().stream().map(map -> (Map<String, Object>) map).collect(Collectors.toList());