加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在flatingBy中使用flatMap的优雅方法

发布时间:2020-12-14 05:52:21 所属栏目:Java 来源:网络整理
导读:所以我有一段代码,我在迭代一个数据列表.每一个都是一个ReportData,它包含一个具有Long caseId和一个Ruling的案例.每项裁决都有一项或多项付款.我希望将带有caseId的Map作为键和付款组作为值(即Map Long,Set Payments). 案例在行之间并不是唯一的,但案例是.
所以我有一段代码,我在迭代一个数据列表.每一个都是一个ReportData,它包含一个具有Long caseId和一个Ruling的案例.每项裁决都有一项或多项付款.我希望将带有caseId的Map作为键和付款组作为值(即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()
                )
            )));

解决方法

另一个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())));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读