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>