我们假设我们有一个国家/地区列表: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).???
答案 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>