[英]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.