Streams y programación
funcional
Streams
• Java 8 introdujo el API de Streams, el cual permite realizar
fácilmente todo tipo de operaciones sobre conjuntos de
datos, típicamente sobre colecciones.
• El API de Streams conlleva en sí mismo todo un paradigma
de programación, pues incorpora las principales
características de la programación funcional.
2
Streams
• La programación funcional se basa en tratar a las funciones
como objetos.
• Las funciones son transformaciones que se realizan, donde
lo importante es que el resultado que produce una función
dependa únicamente de la entrada a esa función.
• En la programación funcional se prefiere el uso de funciones
que no tengan efectos secundarios, es decir, funciones que
no modifiquen estados externos a su ámbito.
3
Streams
• Cuando utilizamos el API Streams es fundamental adoptar el
paradigma funcional.
• Si no lo hacemos así, lo que estamos haciendo es disfrazar
programación imperativa con Streams, convirtiendo un
código que era más fácil de entender con programación
iterativa en un código de difícil comprensión.
4
Streams
• Para ilustrar un ejemplo de antipatrón, supongamos que
tenemos una lista de nombres de persona y queremos saber
cuántas veces se repite cada nombre.
5
Streams
• Podríamos pensar que la solución podría consistir en un Map,
donde el nombre de la persona sería la clave y la frecuencia
de aparición el valor.
• A continuación crearíamos un Stream a partir de la lista y
comenzaríamos a iterar. La iteración consistiría en invocar el
método merge() de Map, el cual requiere tres parámetros: la
clave, el valor si la clave no existe, el valor si la clave existe.
6
Streams
• ¿Cuál es el problema de este código?
• Pues que en la lambda estamos cambiando el estado del
Map, que es una variable externa al Stream y esto es
justamente lo que no podemos hacer en el paradigma
funcional.
7
Streams
• Haciendo uso del paradigma funcional, la solución sería
como sigue:
8
Streams
• Por otro lado, pensemos que es preferible devolver el tipo
Collection que Stream.
• Si devolvemos un Stream estamos impidiendo que quien
recibe los datos pueda hacer una programación iterativa.
• En cambio, si retornamos un Collection dejamos las dos
posibilidades abiertas: puede iterar directamente la colección
o generar un Stream a partir de la colección.
9
Streams. Mejoras añadidas en Java 9
• A destacar los siguiente cuatro métodos:
• takeWhile() / dropWhile() son muy convenientes para
seleccionar elementos de colecciones que están ordenadas.
• takeWhile() selecciona los n primeros elementos mientras que
sea verdadera la condición que se le pasa. dropWhile() los n
últimos.
10