优雅的方式到flatMapBy中的flatMap集

Lar*_*aas 6 java java-8 java-stream

所以我有一段代码,我在迭代一个数据列表.每一个都ReportData包含一个带有一个Long caseId和一个的案例Ruling.每个Ruling都有一个或多个Payment.我希望MapcaseIdas键和付款组作为值(即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()
                )
            )));
Run Code Online (Sandbox Code Playgroud)

Ous*_* D. 5

另一个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;}));
Run Code Online (Sandbox Code Playgroud)

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

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

  • ...如果您仍然被迫使用Java 8,您将在[此答案]末尾找到与`flatMapping`收集器兼容的Java 8(/sf/answers/2739173461/) .由于它具有相同的签名,因此将来很容易从该解决方案迁移到标准API版本. (2认同)