如何使用 Java 流在第一个和最后一个嵌套对象之间创建 map<k,v>?

Cur*_*ity 2 java java-8 java-stream

假设我有以下课程:

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

class B {
    int id;
}
Run Code Online (Sandbox Code Playgroud)

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

Rav*_*ala 5

您可以使用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;
                }));
Run Code Online (Sandbox Code Playgroud)

但是,如果给定的一组 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())));
Run Code Online (Sandbox Code Playgroud)