首页 > 解决方案 > 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' 语句,因为它也应该生成地图,但我失败了。

标签: javalambdajava-8hashmapjava-stream

解决方案


您似乎想将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.groupingByCollectors.mapping.


推荐阅读