我使用的是Java 8 .mapToLong,我无法理解它背后的逻辑。我得到1156个值,但是b的长度是34,所以程序正在做34 * 34 = 1156。我需要将每个县的total_population除以每个县的number_of_cities,以获得每个县的平均人口数,并将该人口推到average_population列表中。这是我正在使用的代码
List<Long> average_population = total_population.stream()
.flatMapToLong(a -> number_of_cities.stream().mapToLong(b -> a / b))
.boxed()
.collect(Collectors.toList());
你能告诉我我做错了吗?
答案 0 :(得分:2)
您的flatMap操作将所有城市数量除以所有人口数量,而不是按县别划分计数。计算也是倒退的:你需要按城市划分人口,而不是相反。让我们摆脱flatMap并使用IntStream
代替,这样你就可以在两个列表中使用单个索引:
IntStream.range(0, total_population.size())
.mapToObj(i -> total_population.get(i) / number_of_cities.get(i))
.collect(Collectors.toList())
更好的方法是将数据封装到单个类中,这样您就不必保留多个列表:
class County {
private final int numberOfCities;
private final int totalPopulation;
public County(int numberOfCities, int totalPopulation) {
this.numberOfCities = numberOfCities;
this.totalPopulation = totalPopulation;
}
public int getNumberOfCities() {
return numberOfCities;
}
public int getTotalPopulation() {
return totalPopulation;
}
}
现在,假设我们有一个List<County> counties
,我们可以收集这样的平均值:
counties.stream()
.map(county -> county.getTotalPopulation() / county.getNumberOfCities())
.collect(Collectors.toList())
或者我们可以在课堂上添加一个平均方法:
public getAverageCityPopulation() {
return totalPopulation / numberOfCities;
}
按照以下方式输出平均值:
counties.stream()
.map(County::getAverageCityPopulation)
.collect(Collectors.toList())