JAVA Stream API-количество элементов вложенного списка

предположим, что у нас есть список стран: List<Country> и каждая страна имеет ссылку на список своих регионов:List<Region> (например, государства в случае США). Что-то вроде этого:--7-->

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? Я думал о чем-то похожем на это, но я не знаю, как подсчитывать элементы вложенных списков с помощью count() метод API-интерфейс потока:

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

3 ответов


можно использовать 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 более одного раза.


вы можете сопоставить каждую страну с количеством регионов, а затем уменьшить результат, используя sum:

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

вы даже можете использовать 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>