如何创建地图<;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()
collectorlist.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()
)
)
);