Hoy vamos a ver una manera muy interesante de operar con colecciones de datos.
¿Querés saber que son los Streams de Java? Descubrámoslo juntos.
En este artículo vamos a tratar básicamente qué son los streams y qué nos permiten hacer. Además veremos un pequeño ejemplo de la diferencia que hay entre una operación con un loop normal y una hecha utilizando Streams.
¿QUÉ SON LOS STREAMS?
Podríamos decir que los Streams son "envoltorios" de colecciones de datos que nos permiten operar con estas colecciones y hacer que el procesamiento masivo de datos sea rápido y fácil de leer. Algo importante a tener en cuenta es que los Streams no almacenan datos y no son una estructura de datos en sí. Tampoco modifican la fuente de datos subyacente. Solo realizan operaciones simples o concatenadas sobre ellos.
¿QUÉ NOS PERMITEN HACER?
Generalmente cuando trabajamos con colecciones filtramos, calculamos y realizamos muchos tipos de operaciones sobre los datos. Los Streams nos permiten a través del paradigma funcional abstraernos del cómo programar esas operaciones y sólo centrarnos en que resultado se espera y escribirlo de una manera muy declarativa.
VEAMOS UN EJEMPLO
Teniendo una lista con N cantidad de números, vamos a realizar una operación para quedarnos sólo con los números que sean menores a X valor.
Ejemplo con un ciclo For:
List<Long> listitaFor = new LinkedList();
for (int i = 0; i < lista.size(); i++) {
Long valorActual = lista.get(i);
if (valorActual < valorMaximo){
listitaFor.add(valorActual);
}
}
En este caso, el for itera la lista y tenemos que aclararle que, valor por valor, los compare con el valor máximo y que en el caso de que sea menor lo agregue a la lista de salida.
Ejemplo con Streams:
List<Long> listitaStream = lista.stream().filter(valor -> valor < valorMaximo)
.collect(Collectors.toList());
En este caso, a una lista le asignamos el return de un Stream al cual sólo le aclaramos que tiene que realizar un filtro a través de una función lambda y que lo tiene que recolectar en una lista.
OPERACIONES
Hay muchas operaciones útiles que se pueden realizar con Streams.
Estas se dividen en:
- Operaciones intermedias: Son operaciones las cuales retornan otro Stream (Stream <T>) y permite concatenar las diferentes operaciones.
- Operaciones de terminal: devuelven un resultado de tipo definido.
CONCLUSIONES
A modo de conclusión, podemos decir que los Streams facilitan mucho trabajar con grandes cantidades de datos de forma muy prolija a la hora de escribirlo en el código. Más allá de eso, también tiene beneficios y contras en cuanto a rendimiento y eso es algo que estaremos tratando en algún próximo post.
Eso es todo hasta acá. ¡Muchas gracias por leer!
En el próximo post de Streams, vamos a estar viendo cuales son estas funciones intermedias y estas funciones terminales con ejemplos específicos de cada una.