Lista de grupos de objetos de propiedad y calcular el promedio de la propiedad del objeto por clave

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 DoubleStreamde 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));

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=185834&siteId=1
Recomendado
Clasificación