Las lambdas son una de las herramientas más potentes en Kotlin, y en cualquier otro lenguaje moderno, ya que permite modelar funciones de forma mucho más sencilla.

La única forma que tenemos de hacer esto en Java 6 es mediante la declaración de interfaces con un único método, y creando objetos anónimos que implemente esas interfaces.

Las lambdas, y sobre todo cómo las lambdas se definen en Kotlin, nos abren un mundo infinito de posibilidades. Iremos viendo algunos de esos casos en siguientes artículos.

Pero si de verdad quieres ver todo esto a fondo y con casos reales, entonces no te lo pienses más y apúntate al intensivo presencial que voy a impartir en breve. Tienes toda la información aquí, o haciendo click en la imagen:

kotin-desarrolladores-android

Lambdas en Kotlin

Una lambda es una forma de representar una función, y ya vimos un ejemplo de ello cuando explicábamos el setOnClickListener :

Como ves, en el lado izquierdo se definen los valores de entrada de la función (en este caso una vista v), y en el lado derecho la operación que realiza dicha función.

Cómo definir una función que acepte lambdas

Si quisiéramos definir nosotros mismos esa función en lenguaje Kotlin, tendríamos lo siguiente:

Esto es lo que se conoce como una Higher-Order Function, o función de alto orden, porque es una función que recibe una función por parámetro, o que devuelve una función.

Transformación de apariencia

La forma natural de llamar a esta función sería la siguiente:

Pero ya hemos visto que hay una forma más compacta de hacer esto, y que además nos ayudará a hacer cosas muy chulas que veremos justo después. ¿A qué se debe esto?

Esto es porque si el último parámetro de una función es a su vez una función, podemos sacarlo de los paréntesis:

Pero además, si sólo hay una función como parámetro, nos podemos cargar directamente los paréntesis

Creación de DSLs

Esto nos permite crearnos nuestros propios DSLs, que pueden llegar a crear mini-lenguajes. En la web de referencia de Kotlin hay un ejemplo con HTML, pero aquí vamos a poner uno más sencillo.

Imagina que quieres crear bloques de código que se ejecuten en otro hilo. Podrías tener una función que reciba a su vez la función que queremos ejecutar en segundo plano:

Esta función crea un hilo con un Runnable que lo único que hace es ejecutar la función que se le pasa por parámetro. Como Runnable  es una clase con un único método en Java, se puede sustituir por una lambda. Luego ejecuta ese hilo.

Ahora en nuestro código podemos crear bloques asíncronos:

Todo lo que está entre los corchetes se ejecutará en un hilo secundario.

Funciones inline

Lo malo de crear funciones que reciban funciones, es que para ello el compilador necesita crearse clases anónimas. Pero esto se soluciona fácilmente añadiendo la palabra reservada inline.

Una función inline no consume tantos recursos, puesto que lo que se hará en tiempo de compilación es sustituir esa función por su código en los sitios donde se llame.

La función doAsync la podemos hacer inline:

El crossinline en este caso es necesario porque se está llamando a f() desde otro contexto de ejecución (otra lambda). No te preocupes, porque el compilador te avisa cuando hace falta usarlo.

Conclusión

Como ves, con las lambdas podemos simplificar mucho nuestro código, e incluso conseguir cosas que antes eran impensables.

Además, la nomenclatura específica de Kotlin hace que podamos crear nuestro propio “lenguaje”, y crear bloques de código con sentido que hagan lo que necesitemos.

Las lambdas dan mucho más de sí, y en el curso presencial daré algunos ejemplos más de lo que podemos hacer con ellas. Las plazas son muy limitadas ¡No te lo pierdas!