Java 8 – Streams

java 8 - StreamsLos Streams son una secuencia de elementos que soportan operaciones de agregación secuencial y paralela. Una de las nuevas características de Java 8 que permite manipular las colecciones como nunca, casi parecido a un sueño.

 

Como programador seguramente has trabajado con una infinidad de colecciones, seguramente te ha tocado recorrerlas, ordenarlas, dividirlas, filtrarlas, eliminar o agregar nuevos elementos en la colección. Y cada vez que hacías esto estabas casi forzado a realizar un foreach sobre la colección, incluso, tenías que hacer un foreach anidado para poder realizar operaciones más complejas; prueba de ello es que el nombreConcurrentModificationException  te recuerda a algo (¿o no?).

Pues bien, los Streams no permite crear atajos a la hora de procesar colecciones, creando flujos de datos que permite el procesamiento de una forma declarativa, es decir, que nos centramos en lo que queremos resolver, y no en cómo debemos hacerlo, como pasa en la programación imperativa.

 

 

Sígueme en mi canal de Youtube

Pero dejémonos de palabrerías (que me sobran) y vallamos a un escenario concreto donde se puede aplicar para entender mejor. Veamos el caso más simple al utilizar una colección, imprimamos todos los valores de una lista ¿Simple no?

 

 

Este código que está viendo, es un escenario normal que utilizarías para imprimir todos los elementos de una lista (apuesto que sí), ¿verdad que no tiene nada de extraño? La verdad es que no, porque ya estamos acostumbrados a hacerlo así, pero te apuesto que tu punto de vista acerca de este código cambiaría si ti dijera que puedo hacer el foreach en una solo línea de código. ¿no me crees? Pues tómala!!

 

 

Probablemente te estés preguntado ¿qué clase de brujería es eso?, pero la realidad es que no hay tal brujería, simplemente estamos utilizando los Streams. Notemos que estamos utilizando el métodostream() para obtener el Stream, seguido, solo utilizamos el métodoforEach() en el cual definimos mediante lo que vamos a hacer para cada elemento de la colección. En este caso estamos imprimiendo cada empleado utilizando Referencia a métodos.

Para comprender mejor que es un stream (espero no herir los sentimientos de algunos) lo voy a explicar de una forma simple fácil de digerir y que pueda que no cuadre con la definición perfecta, pero seguro me entenderás. Imagina que los streams son una forma de iterar todos los elementos de la colección de una forma simple, y que además mientras los iteras puedes realizar operaciones sobre la colección de forma declarativa. Es decir, vamos a realizar operaciones pero centrándonos en el objetivo que buscamos, no en cómo implementar el algoritmo para que funcione. Veamos otro ejemplo más complejo.

 

Imaginemos que tenemos una lista de Empleados, cada empleado tiene un ID que lo identifica como único, tiene un nombre y el departamento el que pertenece. La lista de empleados es la siguiente:

 

IDNameDepartment
1Oscar BlancarteSystems
2Liliana CastroSystems
3Fernanda MartinezSystems
4Manuel LopezRH
5Rebeca PerezSystems
1Oscar BlancarteSystems

 

Ahora bien, sobre esta lista queremos filtrar todos los Empleados que pertenecen al departamento de sistemas, luego vamos a ordenas todos los empleados de forma ascendente por su nombre, luego vamos a filtrar los elementos repetidos mediante su ID, finalmente, imprimiremos el nombre de todos los empleados que cumplieron con todas las reglas. Pfff!! ¿Imaginas hacer esto con una colección? A mí ya me empezó a doler la cabeza 🙁 . Por suerte, el enfoque declarativo de los Streams nos permite enfocarnos solamente en el que y no en el cómo. Veamos cómo quedaría la solución usando Streams.

 

 

 

Ves lo fácil que es hacer todo esto con los Streams, solo nos preocupamos por lo que queremos hacer pero no por el cómo. Veamos los métodos del Stream utilizados, filter, nos permite filtrar elementos de la lista, para lo cual solo deberemos crear una expresión que regrese un boolean, si regresa true, entonces es agregado al Stream de resultados. Luego tenemos el métodosorted() en el cual definimos cual es mayor mediante la comparación de los nombres. Seguido, utilizamos el métododistinct() para filtrar los Empleados repetidos, para esto hemos sobreescrito el método equals para comprar por el ID en lugar del Hashcode. Finalmente un foreach para imprimir los resultados:

 

  • Fernanda Martinez
  • Liliana Castro
  • Oscar Blancarte
  • Rebeca Perez

 

¡Realmente sorprendente verdad!!, al menos para mí si… Pues bien, así como vimos algunos métodos interesantes de los Streams, debes de saber que la interface Stream proporciona varios métodos interesantes que te pueden ayudar muchísimo, sin embargo la intención de este artículo es introducirte en el concepto de los Stream y que logres entender que son y cómo se utilizan, por lo que si quieres aprender todavía más, poder ver este link, donde explican a profundidad la interface Stream y todos los métodos que expone. Me gustaría explicarte a detalle cada uno de los métodos disponibles, pero en realidad creo que sería reinventar la rueda, pues en el link se explica mucho mejor de lo que yo mismo podría hacerlo.

El resultado se puede apreciar mejor con la siguiente imagen:

Java 8 - Streams

 

En fin, creo que si lograste entender que son los Streams yo me doy por bien servidor, pero si por algún motivo tienes alguna duda, puedes escribirme en la sección de comentarios y con gusto te contestaré.

 

Artículos relacionados

Java Message Service (JMS) En este Post se habla hacer de la especificación de JMS, los patronos de entrega de manejes que soporta como lo son Punto a Punto(P2P) y Publicador/Su...
Java – Weakreference Este tema hasta para los expertos en java les puede resultar desconocido y es que siempre creemos que un objeto que no esta referenciado por ninguna v...
toString elegantes con ReflectionToStringBuilder En esta ocasión les quiero platicar de una fantástica clase de utilidad que yo he utilizado con frecuencia en el desarrollo de software, Esta clase ...

Oscar Blancarte

Ideológico, Innovador y emprendedor, Padre, Tecnólogo y Autor, amante de la ciencia y la tecnología en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultoría. Amante de la programación y el Ajedrez.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *