Java Stream API - 对嵌套列表的项目进行计数

2022-09-01 15:04:58

让我们假设我们有一个国家列表:每个国家都有一个对其区域列表的引用:(例如,美国的情况是州)。像这样:List<Country>List<Region>

USA
  Alabama
  Alaska
  Arizona
  ...

Germany
  Baden-Württemberg
  Bavaria
  Brandenburg
  ...

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

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

for (Country country : countries) {
    if (country.getRegions() != null) {
        regionsCount += country.getRegions().size();
    }
}

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

countries.stream().filter(country -> country.getRegions() != null).???

答案 1

您可以使用获取区域列表,然后 mapToInt 获取每个国家/地区的区域数。之后,使用 sum() 获取 : 中所有值的总和:map()StreamIntStream

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();

注意:在筛选之前使用的好处是,您不需要多次调用。getRegionsgetRegions


答案 2

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

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

推荐