如何创建地图<;k、 v>;在使用Java流的第一个和最后一个嵌套对象之间?

如何创建地图<;k、 v>;在使用Java流的第一个和最后一个嵌套对象之间?,java,java-8,java-stream,Java,Java 8,Java Stream,假设我有以下课程: class A { int id; List<B> b; } class B { int id; } A类{ int-id; 名单b; } B类{ int-id; } 我想在a.id和B.id列表之间创建一个映射(map,其中key=a.id,而list对应于每个a的B.id字段列表)。我尝试了收集器.groupingBy和收集器.mapping的各种组合,但没有效果。有人能帮我吗?您可以使用带有合并功能的toMap收集器来解决此问题

假设我有以下课程:

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

class B {
    int id;
}
A类{
int-id;
名单b;
}
B类{
int-id;
}

我想在a.id和B.id列表之间创建一个映射(
map
,其中key=
a.id
,而
list
对应于每个a的B.id字段列表)。我尝试了
收集器.groupingBy
收集器.mapping
的各种组合,但没有效果。有人能帮我吗?

您可以使用带有合并功能的
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;
                }));
列表列表列表;
//在这里初始化列表。。。
Map aMap=aList.stream().collect(
Collectors.toMap(element->element.id,
元素->元素b
.stream()
.map(b->b.id)
.collect(收集器.toList())
)
);

在java-8中,您可以使用在摸索时仅映射
列表b
,然后将值
列表
转换为
列表

Map result=list.stream()
.collect(收集器).groupingBy(A::getId,
Collectors.mapping(A::getB,Collectors.collectingAndThen(Collectors.toList(),
l->l.stream().flatMap(List::stream).map(B::getId.collect(Collectors.toList())));
Java 9添加了收集器,非常适合:

// using static imports of various Collectors
listOfA.stream().collect(
  groupingBy(
    A::getId,
    flatMapping(
      a -> a.getB().stream().map(B::getId),
      toList()
    )
  )
);

为什么不干脆
toMap()
collector
list.stream().collect(Collectors.toMap(A::getId,A->newarrarylist(A.getB().stream().map(B::getId).collect(Collectors.toList()),(l1,l2)->{l1.addAll(l2);return l1;})我已经更新了答案。谢谢你的反馈@哈迪吉
List<A> aList;
//initialize aList here...
Map<String, List<Integer>> aMap = aList.stream().collect(
        Collectors.toMap(element -> element.id,
                         element -> element.b
                                 .stream()
                                 .map(b -> b.id)
                                 .collect(Collectors.toList())
        )
);
Map<Integer, List<Integer>> result = list.stream()
            .collect(Collectors.groupingBy(A::getId,
                    Collectors.mapping(A::getB, Collectors.collectingAndThen(Collectors.toList(),
                            l -> l.stream().flatMap(List::stream).map(B::getId).collect(Collectors.toList())))));
// using static imports of various Collectors
listOfA.stream().collect(
  groupingBy(
    A::getId,
    flatMapping(
      a -> a.getB().stream().map(B::getId),
      toList()
    )
  )
);