java - 优雅的方式来 flatMap Set Sets inside groupingBy
问题描述
所以我有一段代码在其中迭代数据列表。每个都是 a ReportData
,其中包含一个带有 aLong caseId
和 one的案例Ruling
。每个Ruling
都有一个或多个Payment
。我希望将 aMap
与caseId
as 键和付款集作为值(即 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()
)
)));
解决方案
另一个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())));
推荐阅读
- sql - Oracle如何获取保存为时间时间戳的今天日期的数据
- wordpress - 在 alb 后面配置 Wordpress HOME_URL 和 SITE_URL,并使用 ssl 终止。寻找在云端使用的可能性
- c++ - 中止的核心转储 C++ malloc sysmalloc
- spring-security - 使用 keycloak rest admin API (Oauth2) 修改用户姓氏后 jhipster 重新加载 OIDC 令牌
- fortran - 如何编译 Fortran 子程序
- php - Wordpress AJAX 未发送并给出 admin-ajax.php 错误 400
- thymeleaf - Thymeleaf 标签“th:for”有什么作用?
- c# - c#中属性类的子类中的递归方法
- firebase - 在构建 MessageBubble(dirty) 时引发了以下 NoSuchMethodError:在 null 上调用了 getter 'millisecondsSinceEpoch'
- node.js - 我的 MERN 应用程序部署到 Heroku 出了什么问题?