Robin-Sudadera:
Digamos que tengo una clase Persona:
class Person {
String firstName;
String age;
public String getFirstName() {
return firstName;
}
public String getAge() {
return age;
}
}
Tengo una List<Person>
como entrada. Como salida me gustaría obtener una DoubleStream
de la edad media por firstName
. Actualmente vez implementado este tipo, que trabaja:
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);
}
Yo siento que debe haber una manera más eficiente de hacer esto. Lo más notable es que estoy creando dos mapas intermedios antes de convertir los a una corriente de nuevo.
Ousmane D .:
Utilice un colector aguas abajo de aplicar operaciones adicionales sobre la agrupación, ejemplo:
return people.stream()
.collect(Collectors.collectingAndThen(
Collectors.groupingBy(Person::getFirstName,
Collectors.averagingDouble(Person::getAge)),
v -> v.values().stream().mapToDouble(Double::doubleValue));