es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener la duración promedio para cada categoría que tenga películas utilizando la API de stream en Java.

Tengo una clase Film con los siguientes atributos:

String name;
double duration;
Collection<string> categories;

Mi tarea es devolver un Map<string, double=""> que represente la duración promedio por categoría.
Debo utilizar la API Stream de Java.

Mi idea es formar entradas de tipo String para la categoría y List<double> donde los elementos sean las diferentes duraciones, luego utilizar el método map de la API Stream para mapearlo a un Map de tipo String y promedio. Pero no estoy seguro de cómo hacerlo. ¿Alguien puede ayudarme?</string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para obtener la duración promedio por categoría utilizando Java Stream API, puede seguir estos pasos:

    1. Utilice el método groupBy() de la clase Collectors para agrupar las películas en función de sus categorías. Esto le dará un Map<string,></string,><film>> donde cada entrada en el mapa corresponde a una categoría y su valor es una lista de películas en esa categoría.
    2. Utilice el método mapValues() de la clase Maps para convertir la List<film> en una List<double> que contenga las duraciones de estas películas. Esto le dará un Map<string,></string,><double>> donde cada entrada en el mapa corresponde a una categoría y su valor es una lista de las duraciones de las películas en esa categoría.

    3. Utilice el método map() de la clase Collectors para convertir la List<double> en la duración promedio de estas películas. Esto le dará un Map<string, double=""> donde cada entrada en el mapa corresponde a una categoría y su valor es la duración promedio de las películas en esa categoría.

    Aquí está el código para lograr esto:

    Map<string, double=""> averageDurationByCategory = 
        films.stream()
             .collect(Collectors.groupingBy(Film::getCategory))
             .mapValues(filmsInCategory -> filmsInCategory.stream()
                                                          .mapToDouble(Film::getDuration)
                                                          .average()
                                                          .orElse(0.0))
             .entrySet()
             .stream()
             .sorted(Map.Entry.comparingByKey())
             .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                                       (oldValue, newValue) -> oldValue, LinkedHashMap::new));
    

    Tenga en cuenta que también he ordenado el mapa resultante por clave y he utilizado un LinkedHashMap para preservar el orden de inserción. Puede ajustar estas operaciones según sus requisitos.</string,></string,>

Comments are closed.