Java Stream API - 计算嵌套列表的项目

dom*_*nik 15 java java-8 java-stream

让我们假设我们有一个国家列表:List<Country>每个国家都有一个区域列表的参考:( List<Region> 例如美国的州).像这样的东西:

USA
  Alabama
  Alaska
  Arizona
  ...

Germany
  Baden-Württemberg
  Bavaria
  Brandenburg
  ...
Run Code Online (Sandbox Code Playgroud)

在"普通的"Java中,我们可以计算所有区域,例如:

List<Country> countries = ...
int regionsCount = 0;

for (Country country : countries) {
    if (country.getRegions() != null) {
        regionsCount += country.getRegions().size();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能通过Java 8 Stream API实现相同的目标?我想到了类似的东西,但我不知道如何使用count()流API的方法计算嵌套列表的项目:

countries.stream().filter(country -> country.getRegions() != null).???
Run Code Online (Sandbox Code Playgroud)

fab*_*ian 32

您可以使用map()获取Stream区域列表,然后mapToInt获取每个国家/地区的区域数量.之后sum()用于获取以下所有值的总和IntStream:

countries.stream().map(Country::getRegions) // now it's a stream of regions
                  .filter(rs -> rs != null) // remove regions lists that are null
                  .mapToInt(List::size) // stream of list sizes
                  .sum();
Run Code Online (Sandbox Code Playgroud)

注意:getRegions在过滤之前使用的好处是您不需要getRegions多次调用.

  • 注意,您可以使用`Objects :: nonNull`而不是`rs - > rs!= null` (6认同)

Vas*_*sky 5

您可以将每个国家/地区映射到区域数量,然后使用sum减少结果:

countries.stream()
  .map(c -> c.getRegions() == null ? 0 : c.getRegions().size())
  .reduce(0, Integer::sum);
Run Code Online (Sandbox Code Playgroud)

  • .reduce(Integer :: sum):) (3认同)