如何使用Stream API计算嵌套列表项?
想象一下3个嵌套列表:
List<OuterList> outerLists;
class OuterList {
List<Sublist> subLists;
}
class Sublist {
List<String> items;
}
我只想总结所有列表中items.size()
的数量。我想尝试类似的东西:
outerLists.stream().forEach(outer ->
outer.getSubLists().stream().forEach(sub ->
sub.getItems().size())
.sum/count()?
答案 0 :(得分:6)
您可以使用flatMapToInt
:
outerLists.stream()
.flatMapToInt(outer ->
outer.subLists.stream().mapToInt(sub -> sub.items.size())
)
.sum();
这比平面映射整个子列表更具性能,因为在这里,我们只是将每个子列表映射到其项目的大小。这里的想法是Stream<OuterList>
被平面映射到IntStream
,其中每个外部被替换为由其所有内部列表的大小构成的流。然后,我们将值与sum()
相加。
答案 1 :(得分:2)
您可以使用function submitFunc(form) { ... }
将flatMap
转换为Stream<OuterList>
,然后转换为所有最里面列表中所有Stream<Sublist>
的{{1}}:
Stream<String>
但是,如果有重复项,则会多次计算。