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

时间:2015-10-24 11:51:51

标签: java java-8 java-stream

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

USA
  Alabama
  Alaska
  Arizona
  ...

Germany
  Baden-Württemberg
  Bavaria
  Brandenburg
  ...

在&#34;普通的&#34; 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).???

3 个答案:

答案 0 :(得分:28)

您可以使用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();

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

您甚至可以使用flatMap(),如:

countries.stream().map(Country::getRegions).flatMap(List::stream).count();

where,

map(Country::getRegions) = returns a Stream<List<Regions>>
flatMap(List::stream) = returns a Stream<Regions>