Resolución de problemas en Java 8 para el tipo Reproductor de Canciones

Sea el tipo Canción dado por esta interface










Queremos disponer de la funcionalidad de un tipo ReproductorMusica que a partir de una Collection de Cancion denominada canciones  implemente en Java 8 métodos que respondan a las siguientes cuestiones:

¿Cuál es el número de canciones de un determinado Genero?






¿Existe alguna canción con precio mayor que uno dado?





¿Todas las canciones duran más de una duración dada?





¿Cuántos interpretes distintos hay?







¿Existe algún interprete cuyo nombre empiece por un determinado carácter?






Que se puede también implementar en una sola línea





¿Cuál es la suma de los precios de las canciones de un determinado género?






También se puede implementar mediante un Collectors





¿Cuál es la calificación media de las canciones de un género?







¿Cuál es el precio medio de las canciones que tienen una calificación dada?





Devuelve el conjunto de los interpretes con alguna canción con calificación mayor que una dada






Devuelve una lista con las canciones cuyos interpretes empiezan por un determinado carácter





Devuelve la canción de mayor duración






Se puede también preguntar por un máximo o mínimo con filtro. Por ejemplo, cuál es la canción de mayor duración de un género concreto






Devuelve la mayor canción en orden natural






¿Cuál es la canción de menor precio con calificación mayor que una dada?






¿Cuál es la canción de menor precio de un determinado género?






¿Cuál es la primera canción en orden alfabético de interprete?





¿Cuál es la canción de título más corto? Se puede resolver creando una Function tal que cada canción se transforme en la longitud de su título






O una Function especializada en devolver enteros (ToIntFunction)






O directamente en el Comparador





Devuelve la primera canción de un interprete dado por su nombre






Dada una palabra devuelve una lista de canciones que contengan esa palabra en el título





Devuelve un conjunto con los nombres de los cantantes que empiecen por un carácter dado






Devuelve un conjunto ordenado con las canciones ordenadas alfabéticamente por título





Devuelve un Map que haga corresponder a cada canción el nombre de su intérprete. Nótese el uso de la Function identidad o su lambda expresión





Devuelve un Map  que asocie cada título de canción con su duración. Este método lanzará una excepción si hay dos canciones con el mismo título.






Devuelve un Map que haga corresponder a cada intérprete el nombre de su canción en la lista. Este método lanzará una excepción si hay un interprete con más de una canción, ya que el método toMap con dos argumentos no permite clave repetida (ver documentación).





Una solución para el problema anterior es usar el método toMap con tres argumentos (ver documentación), el tercero de los cuales es un BinaryOperator para que si hay dos valores para una misma clave los "reduzca" a uno. En este caso, es fácil convertir dos String en uno mediante concatenación.






Una solución más sencilla al problema anterior de colisiones de claves es usar el método groupingBy en vez de toMap que en caso de clave repetida, por defecto, une los valores en una lista. Así el siguiente código devuelve un Map que relaciona cada intérprete con una lista de sus canciones





El método groupingBy permite usar otros Collectors como segundo argumento. Así, el siguiente código devuelve un Map que asocia a cada Genero su número de canciones






También se pueden devolver la suma de los precios por género






O la media de las calificaciones





Para devolver el máximo o el mínimo se puede "reducir" mediante una función auxiliar. En este caso se devuelve un Map que asocia a cada género la canción con mayor calificación.










Otra solución es recurrir al método maxBy de BinaryOperator











No hay comentarios:

Publicar un comentario