java - lambda 和流 : collect in a Map

标签 java lambda java-8 hashmap java-stream

我想使用 Stream 和 Lambda 组合构建一个 map 。

我尝试了很多方法,但还是卡住了。这是使用 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);
        }

如您所见,我只知道如何在列表中进行收集,但我无法对 map 进行同样的操作。这就是为什么我必须再次流式传输我的列表以构建第二个列表,最后将所有列表放在 map 中。 我也尝试过“collect.groupingBy”语句,因为它也应该生成 map ,但我失败了。

最佳答案

您似乎想将 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 :

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

关于java - lambda 和流 : collect in a Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52741495/

相关文章:

java - 如何读取php代码对android java代码的响应

java - 我不明白 System.out.println((char)b) 和 System.out.write((char)b) 之间的输出差异

java - WebClient (spring-boot-starter-webflux) 向错误的 url 发送请求

java - 在 jdk 6 与 jdk 8 中创建临时目录

java - 无法解析 Java 8 中的构造函数

java.xml.Validator : xsi:schlemaLocation is ignored when namespaces are present

java - Spring 3 和 JPA 使用 JTATransactionManager,但事务管理器无法提交

c# - 如何根据多个条件并使用 linq 从通用列表中删除项目

node.js - Dynamodb batchWrite 无法在带有异步的 Lambda 中工作

intellij-idea - 此语言级别不支持 lambda 表达式 IDEA