Java 8: Expresiones Lambda
Las expresiones lambda son una de las múltiples funcionalidades nuevas que nos ofrece Java 8. Estas expresiones son parte de los primeros pasos de Java hacia la programación funcional, y su cometido es introducirnos a las funciones anónimas mediante las cuales podemos definir el comportamiento de los objetos, y los datos que encapsulan.
¿En qué consiste la programación funcional? La programación funcional es un paradigma de programación basado en las funciones matemáticas, que especifica que una función que recibe un parámetro X, siempre devolverá un resultado Y.
Este paradigma permite definir comportamiento mediante funciones, pudiendo inyectarlo como parámetro de entrada en los objetos, o devolverlo como resultado de otro método.
Introducción a las funciones lambda
Por tanto, deducimos de lo anterior, que las funciones lambda son la funcionalidad que Java ofrece para facilitar la definición de comportamiento mediante parámetros.
Una función lambda consta de los siguientes elementos:
- Parámetros de entrada
- Operador lambda
- Cuerpo del método
Ejemplo de expresión lambda
El primer elemento de la expresión lambda, los parámetros de entrada se puede definir como:
- Expresión lambda sin parámetros de entrada
|
|
- Expresión lambda con un parámetro de entrada simple
|
|
- Expresión lambda con múltiples parámetros de entrada
|
|
Con respecto al cuerpo del método, para los métodos con una única línea de código no es necesario definir las llaves.
|
|
Mientras que para métodos con varias líneas, las llaves serán obligatorias.
|
|
Referenciando variables externas
Las expresiones lambda pueden hacer referencia a variables locales finales, o efectivamente finales dentro de la clase donde se definen.
¿Y qué es eso de variables efectivamente finales? Las variables efectivamente finales son variables que, aunque no se definen explícitamente como finales, cumplen los requisitos para poder serlo.
En el siguiente ejemplo podemos ver cómo se utiliza la variable “before” , una variable efectivamente final, dentro de la expresión lambda que filtra los resultados de la lista de ficheros.
|
|
Referencia “this” en las funciones lambda
El uso de “this” en las expresiones lambda hace referencia al objeto en el cual se ha definido la expresión. Siguiendo con el ejemplo anterior, se podría definir una variable final en el objeto que encapsula al método “expire”, y utilizar “this” para hacer referencia a dicha variable.
|
|
Esto es así debido a que las expresiones lambda no son más que una representación de funciones anónimas, y estas no están asociadas a ninguna clase, por tanto, una función lambda no puede referenciarse a sí misma.
Creando nuestra propia expresión lambda con interfaces funcionales
Ahora que ya sabemos cómo funcionan las expresiones lambda, podemos empezar a crear las nuestra. Para ello utilizaremos interfaces funcionales.
Las interfaces funcionales son aquellas que definen un único método abstracto. Las interfaces funcionales también pueden definir a su vez tantos métodos estáticos y métodos default como sean necesarios.
Para crear nuestra interfaz funcional, deberemos utilizar la anotación @FunctionalInterface.
|
|
Una vez creada nuestra interfaz funcional, podremos instanciarla utilizando una expresión lambda, tal y como se define a continuación:
|
|
Si quieres saber más acerca de las interfaces funcionales puedes hacerlo aquí.