首页 > 解决方案 > 优雅的方式来 flatMap Set Sets inside groupingBy

问题描述

所以我有一段代码在其中迭代数据列表。每个都是 a ReportData,其中包含一个带有 aLong caseId和 one的案例Ruling。每个Ruling都有一个或多个Payment。我希望将 aMapcaseIdas 键和付款集作为值(即 a Map<Long, Set<Payments>>)。

案例在行之间不是唯一的,但案例是唯一的。

换句话说,我可以有几行具有相同的案例,但它们会有独特的裁决。

下面的代码给了我一个Map<Long, Set<Set<Payments>>>几乎是我想要的,但我一直在努力寻找在给定上下文中对最终集合进行 flatMap 的正确方法。我一直在做变通方法以使逻辑按原样使用此地图正常工作,但我非常想修复算法以正确地将一组付款组合成一个集合,而不是创建一组集合。

尽管使用 Java 流的 flatMapping 似乎是一个有点流行的话题,但我四处搜索并找不到相同类型的迭代的问题。

rowData.stream()
        .collect(Collectors.groupingBy(
            r -> r.case.getCaseId(),
            Collectors.mapping(
                r -> r.getRuling(),
                Collectors.mapping(ruling->
                    ruling.getPayments(),
                    Collectors.toSet()
                )
            )));

标签: javajava-8java-stream

解决方案


另一个JDK8解决方案:

Map<Long, Set<Payment>> resultSet = 
         rowData.stream()
                .collect(Collectors.toMap(p -> p.Case.getCaseId(),
                        p -> new HashSet<>(p.getRuling().getPayments()),
                        (l, r) -> { l.addAll(r);return l;}));

或者从 JDK9 开始,您可以使用flatMapping收集器:

rowData.stream()
       .collect(Collectors.groupingBy(r -> r.Case.getCaseId(), 
              Collectors.flatMapping(e -> e.getRuling().getPayments().stream(), 
                        Collectors.toSet())));

推荐阅读