El uso de Java Stream map es una de las operaciones más comunes cuando trabajamos con un flujo de Streams . El método map nos permite realizar una transformación rápida de los datos y muy directa sobre el flujo original.
Vamos a ver algunos ejemplos que nos ayuden a clarificar como se utiliza Java Stream map. Para ello nos vamos a apoyar en una lista de Personas .
Persona p1 = new Persona("pedro", 20, "perez"); Persona p2 = new Persona("juan", 25, "perez"); Persona p3 = new Persona("ana", 30, "perez"); List < Persona > lista = new ArrayList < Persona > (); lista.add(p1); lista.add(p2); lista.add(p3);
Java Stream Map
La primera operación que vamos a realizar es convertir nuestra lista de personas a una lista de números enteros.
Realizada esa operación podemos usar el método reduce para sumar todas las edades e imprimirlas en la consola.
lista .stream() .map(Persona::getEdad) .reduce((a, b) - > a + b) .ifPresent(System.out::println);
El resultado es :
Sin embargo esta aunque este una solución válida no es la mejor solución
Java Stream Map vs MapInt y MapDouble
El método map viene con dos métodos adicionales orientados a trabajar con datos numéricos. Estos métodos son maptoInt y mapToDouble. Si cambiamos nuestro método de map a maptoInt o maptoDouble se nos abrirá la posibilidad de acceder a métodos adicionales muy orientados a estadísticas.
Veamos su código:
Podemos ver el resultado por la consola.
int total = lista.stream().mapToInt(Persona::getEdad).sum(); System.out.println(total); lista.stream().mapToDouble(Persona::getEdad).average().ifPresent(System.out::println); lista.stream().mapToInt(Persona::getEdad).max().ifPresent(System.out::println);; lista.stream().mapToInt(Persona::getEdad).min();
Es una forma más cómoda de trabajar con valores numéricos ya que las transformaciones directamente nos lo pasan a tipos fundamentales.
Java Stream map statistics
Hay situaciones en las que podemos querer acceder de forma directa a todas las estadísticas. Los streams numéricos soportan el método de summaryStatistics que nos permite acceder directamente a todos los valores.
DoubleSummaryStatistics estadisticas = lista.stream() .mapToDouble(Persona::getEdad) .summaryStatistics(); System.out.println(estadisticas.getAverage());
Está bien el resultado ?
75
75
25.0
30
Algo no me cuadra ??
75
75
25.0
30
Está bien ese resultado ??
No lo he revisado que problema tienes?
Saludos.
He visto la captura y también noté el problema. El problema está en la captura mas no en los resultados.
El valor 75 de la primera línea corresponde al ejemplo del punto Java Stream Map.Los valores 75, 25.0 y 30 corresponden al ejemplo del punto Java Stream Map vs MapInt y MapDouble. Supongo que el autor debe de haber omitido por error el valor 20 de la captura; este valor es el valor devuelto por la sentencia
Buen material.
Que tal amigo gracias por la documentación de programación reactiva ( tu tiene algún ejemplo utilizando los operadores MapToINT en específico la función average) me serviría de mucha ayuda ya que hay poca documentación de programación funcional.
No tengo nada más por ahora ya lo siento 🙂
Que poquito me gustan los lamdas y la programación funcional mezclada con la POO, para el manteniento del código y la legibilidad del mismo no me parecen lo mejor.
Pero gracias a tus post voy viendo lo útil y rápido que es, aunque nunca he sido amigo de hacer muchas cosas en una sóla linea de código ni una clase con centenas de líneas de código, sobre todo por legibilidad ya que el programador que venga detrás puede no entenderlo bien.
Gracias Cecilio.
De nada 🙂 . El tema de la programación funcional es poco a poco . Con tiempo la integraremos mejor con la programación orientada a objeto