.mapToLong方法逻辑

时间:2017-10-10 21:26:54

标签: java lambda collections

我使用的是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());

你能告诉我我做错了吗?

1 个答案:

答案 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())