Java Streams

By Eugenia Pérez | 12 February, 2018

Ahí va otra mini-entrega del libro… Para que a Java le dejen de llamar el COBOL del Siglo XXI ha procurado actualizar, entre otras cosas, el tratamiento de colecciones…

El lenguaje de programación Java está evolucionando en las últimas versiones, incorporando técnicas e incluso paradigmas de otros lenguajes como la programación funcional. Una de los avances más evidentes es el tratamiento que permite hacer de las colecciones con métodos bien conocidos en otros entornos como map, filter, etc, sin la necesidad de hacer bucles. En lugar de escribir el típico bucle for para recorrer una lista, ahora se puede convertir la colección en un stream e ir aplicando filtros y funciones en una única sentencia. Esta forma de trabajar es similar a la que se utiliza en la programación reactiva, donde los datos llegan en forma de flujos. A continuación se presentan las distintas técnicas existentes en Java para el tratamiento de colecciones, las cuales nos servirán para incorporar, además de una actualización del conocimiento del lenguaje, una manera práctica de introducir el concepto de flujos o streams.

Bucles sobre colecciones
Supongamos que queremos hacer un programa que cuente los números pares de un array. Esta sería la forma clásica:

c

Desde la versión 5 de Java, existe un foreach implícito en utilizando la sentencia for, con la cual se puede ahorrar el tratamiento de índices.

Otra forma peculiar es aplicar el foreach directamente sobre la colección, cosa que en otros lenguajes (Ruby, JavaScript) es algo de lo más natural. En el caso de Java, nos obliga a crear una instancia de Consumer con el método accept para tratar cada elemento.

Streams sobre colecciones
Hay una manera de hacerlo con una única línea. Se trata de usar los streams. Desde la versión 8 de Java, las colecciones pueden convertirse en streams invocando simplemente el método stream(). A partir de ahí, se pueden aplicar filtros, agrupaciones y toda clase de modificaciones. Este sería el ejemplo más simple. Convertimos la colección a Stream y a cada elemento se le aplica el println para mostrarlo por pantalla.

Volviendo al problema de contar los números pares, utilizando streams nos basta con una línea de código.

Otra técnica que se puede usar parallelStream, el cual procesa varios elementos de la colección a la vez. Según lo que querramos obtener no siempre será lo aconsejable.

Map nos permite aplicar una función a cada elemento, en este caso tomamos cada entero , lo convertimos a String, luego a Float, y finalmente retornamos una lista de Float.

Mediante filter, podemos aplicar un filtro a cada elemento para que se selecionen únicamente aquellos que cumplan con esa condición, y mediante el collect convertimos todos esos elementos en una lista.

Además de aplicar filtros, también se puede aplicar al final el método size para obtener simplemente el total de valores que cumples la condición de filtrado.

Si queremos sacar determinados valores pero solamente cierto número de ellos, se pueden aplicar distintas funciones:

  • limit(n): en lugar de tratar todos los elementos se limita a n.
  • skip(n): permite saltar n elementos del Stream.

Una forma de convertir la lista a una cadena, aplicando el formato que queramos, es mediante la conversión a String y aplicando una unión (collect) de todos los elementos con una cadena de unión concreta.

Otra función obvia es la de suma.

Mediante collect podemos unir todos los elementos en uno aplicando distintas funciones. En este caso, se suman todos los valores de la colección.

También al stream se le pueden sacar valores concretos como el máximo y el mínimo:

En el tratamiento de Streams también existe un método por defecto que nos ofrece una instancia de IntSummaryStatistics, que, como su nombre indica, contiene información sobre la colección, como número de elementos, tipos, etc.

En el caso de tener, ya no un conjunto de números sino un conjunto de listas de números, se puede aplicar el aplanado de la misma (flatten), es decir, múltiples listas que se convierten en una.

También se pueden crear agrupaciones y formar otras estructuras de datos. En el siguiente ejemplo, la lista de números se agrupan en una estructura Map.

…That’s all forks!
facebooktwittergoogle_plusredditpinterestlinkedinmailby feather