首页 > 解决方案 > 如何创建地图在使用 Java 流的第一个和最后一个嵌套对象之间?

问题描述

假设我有以下课程:

class A {
    int id;
    List<B> b;
}

class B {
    int id;
}

我想在 A.id 到 B.id 列表之间创建一个映射(Map<Integer, List<Integer>>其中 key = A.id,并且List<Integer>对应于每个 A 的 B.id 字段列表)。Collectors.groupingBy我尝试了and的各种组合Collectors.mapping,但没有效果。有人可以帮帮我吗?

标签: javajava-8java-stream

解决方案


您可以使用toMap带有合并功能的收集器来解决此问题。这是它的外观。

Map<Integer, List<Integer>> resultMap = aList.stream()
    .collect(Collectors.toMap(A::getId,
        a -> a.getB().stream().map(B::getId)
            .collect(Collectors.toList()), (l1, l2) -> {
                    l1.addAll(l2);
                    return l1;
                }));

但是,如果给定的一组 A 对象具有不同的 id 值,那么您可以只省去合并函数,这是toMap收集器的第三个参数。这是简化版。

Map<Integer, List<Integer>> resultMap = aList.stream()
    .collect(Collectors.toMap(A::getId, 
        a -> a.getB().stream().map(B::getId)
            .collect(Collectors.toList())));

推荐阅读