如何计算嵌套列表的项目?

时间:2016-03-18 14:24:17

标签: java java-8 java-stream

如何使用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()?

2 个答案:

答案 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>

但是,如果有重复项,则会多次计算。