java - Lambda & Stream : 在地图中收集
问题描述
我想使用 Stream 和 Lambda 对构建地图。
我尝试了很多方法,但我被卡住了。这是使用 Stream/Lambda 和经典循环的经典 Java 代码。
Map<Entity, List<Funder>> initMap = new HashMap<>();
List<Entity> entities = pprsToBeApproved.stream()
.map(fr -> fr.getBuyerIdentification().getBuyer().getEntity())
.distinct()
.collect(Collectors.toList());
for(Entity entity : entities) {
List<Funder> funders = pprsToBeApproved.stream()
.filter(fr -> fr.getBuyerIdentification().getBuyer().getEntity().equals(entity))
.map(fr -> fr.getDocuments().get(0).getFunder())
.distinct()
.collect(Collectors.toList());
initMap.put(entity, funders);
}
如您所见,我只知道如何在列表中收集,但我不能用地图做同样的事情。这就是为什么我必须再次流式传输我的列表以构建第二个列表,最后将所有内容放在一张地图中。我也尝试过 'collect.groupingBy' 语句,因为它也应该生成地图,但我失败了。
解决方案
您似乎想将pprsToBeApproved
列表中的任何内容映射到您的Funder
实例,并按购买者分组Entity
。
你可以这样做:
Map<Entity, List<Funder>> initMap = pprsToBeApproved.stream()
.collect(Collectors.groupingBy(
fr -> fr.getBuyerIdentification().getBuyer().getEntity(), // group by this
Collectors.mapping(
fr -> fr.getDocuments().get(0).getFunder(), // mapping each element to this
Collectors.toList()))); // and putting them in a list
如果您不想为特定实体提供重复的资助者,则可以改为收集到集合地图:
Map<Entity, Set<Funder>> initMap = pprsToBeApproved.stream()
.collect(Collectors.groupingBy(
fr -> fr.getBuyerIdentification().getBuyer().getEntity(),
Collectors.mapping(
fr -> fr.getDocuments().get(0).getFunder(),
Collectors.toSet())));
这Collectors.groupingBy
与Collectors.mapping
.
推荐阅读
- ios - 如何将 [NSManageObject] 数组“向下转换”到所选实体?
- kotlin - RetryWhen 中需要使用 AtomicBoolean
- glassfish-2.x - 如何在 Eclipse 中为 glassfish 2.1 服务器安装 glassfish 工具
- enums - Bison/Yacc 错误:字段类型不完整
- delphi - 为什么我收到调用错误:找不到方法
- php - PHP:CURL 返回空数据
- android - 有什么方法可以让我们了解指纹认证的指纹细节吗?
- java - 如何在edittext android中取消加粗和取消突出显示选定的文本
- r - dplyr slice:有平局时基于向量的优先级
- angular - 将 ag-grid 与 flexbox 一起使用