簡體   English   中英

按屬性分組對象列表,並計算每個對象的對象屬性的平均值

[英]Group list of objects by property and calculate average of property of object per key

假設我有一個Person類:

class Person {
    String firstName;
    String age;

    public String getFirstName() {
        return firstName;
    }

    public String getAge() {
        return age;
    }
}

我有一個List<Person>作為輸入。 作為輸出,我想獲得每個firstName的平均年齡的DoubleStream 我目前已經像這樣實現了它,它有效:

public DoubleStream getAverageAgesPerFirstName(List<Person> people) {
    return people
            .stream()
            .collect(
                    groupingBy(Person::getFirstName)
            )
            .entrySet()
            .stream()
            .collect(
                    toMap(Entry::getKey, this::getAverageAge)
            )
            .values()
            .stream()
            .mapToDouble(Double::doubleValue)
}

private double getAverageAge(Entry<String, List<Person>> entry) {
        return entry.getValue().stream().map(Person::getAge).mapToDouble(Integer::doubleValue).average().orElse(0);
    }

我覺得應該有一個更有效的方法來解決這個問題。 最值得注意的是,我在創建兩個中間地圖之前再次將它們轉換為流。

使用下游收集器在分組時應用進一步的操作,例如:

return people.stream()
             .collect(Collectors.collectingAndThen(
                 Collectors.groupingBy(Person::getFirstName, 
                    Collectors.averagingDouble(Person::getAge)), 
                        v -> v.values().stream().mapToDouble(Double::doubleValue));

這是使用averagingDouble收集器的簡化版本:

public DoubleStream getAverageAgesPerFirstName(List<Person> people) {

    return people.stream()
            .collect(Collectors.groupingBy(Person::getFirstName,
                    Collectors.averagingDouble(p -> Double.valueOf(p.getAge()))))
            .values()
            .stream()
            .mapToDouble(d -> d);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM