Kotlin: funciones Lambda, adiós al código duplicado #AndroidMeetsKotlin
Francisco Manuel López Jurado Noticias 22/09/2017
Antes de comenzar con su aplicación desarrollando en Android, debemos tener una pequeña introducción a las funciones lambda. Éstas son muy utilizadas para reducir el código repetitivo e innecesario en nuestras aplicaciones.
Sin más, ¡comenzamos!
¿Qué es una función lambda?
Se trata de la forma más simple de definir funciones anónimas y es una de las características que le pedimos a cualquier lenguaje moderno o evolución de uno ya existente. Gracias a estas expresiones, no necesitaremos definir métodos en clases abstractas o interfaces y podremos pasar una función como parámetro de otra.
Sintaxis básica
Una expresión lambda en Kotlin siempre está rodeada de llaves y no hay paréntesis alrededor de los argumentos. La flecha separa la lista de argumentos del cuerpo de la expresión.
Además, es posible almacenar un lambda en una variable para usarla como predicado en nuestras funciones:
La mejor forma de ver su potencial es detallando un ejemplo con uno de los códigos más repetitivos en Android y Java, setOnClickListener y los métodos de Colecciones.
La simpleza, hecha lenguaje
Antes de que tuviésemos ButterKnife y su agradable forma de definir eventos de "clickado", "bindeado" de vistas, etc. ¿Cuántas veces hemos visto el siguiente código?
Pues por fin, podemos decir adiós a este código tan repetitivo e innecesario y hacerlo todo mucho más simple.
Existen diversas formas de invocar esta función según el uso o no de los parámetros o su orden.
En este caso, podemos ver que los elementos que están a la izquierda de la flecha son los parámetros de la función (en este caso una vista), mientras que el de la derecha se trata del valor o función retornada.
Podremos deshacernos de los parámetros de la izquierda si éstos no son usados y si la función es la última en los parámetros, podemos moverla fuera de los paréntesis. Para finalizar, si en la función sólo tenemos un parámetro, eliminaremos los paréntesis.
Nuestro función anterior quedaría tal que así:
En resumen, menos código y más legible.
Código repetitivo… ¡Se acabó!
Uno de los primeros problemas que nos encontramos con la clase Colecciones en Java es que duplicamos código sin ton ni son. Un ejemplo básico es recorrer un listado de elementos y buscar el que tenga un valor mínimo o máximo dentro del mismo o que se cumpla una condición. En Java tendríamos que crear el bucle, usar variables de control y almacenado del valor final y por supuesto incluir la condición hasta devolver el valor final. En resumen, a mayor cantidad de código, mayor posibilidad de fallos.
En Kotlin, todo se resume a una línea de código, por lo que el margen de error es mínimo:
Como podemos ver, el código entre llaves es una función lambda que recibe como parámetro el objeto que lo está usando (en este caso un objeto Vehicle) y retorna el valor que se va a comparar (los años). Por lo que finalmente obtendremos el valor “12” que es el mayor del listado.
Funciones de colecciones más útiles y usadas
- Filter
La función filter permite filtrar elementos de un listado de una forma fácil y rápida. Es importante saber que puede eliminar elementos de una lista pero en ningún caso puede editar los elementos de su interior:
- Map
La diferencia con la función filter es que ésta sí puede editar los elementos que tiene en su interior, por lo que la función lambda es aplicada a cada elemento de la lista:
También es muy útil para transformar una lista de objetos a otros, por ejemplo:
Si tenemos una lista de vehículos podemos convertirlo en una lista de matrículas de los mismos tal que así:
- All
Se acabaron las iteraciones y comprobaciones para ver si todos los elementos de una lista cumplen un predicado:
- Any
En este caso se comprueba si algún elemento cumple el predicado pasado por parámetro:
- Count
Devuelve el número de elementos que cumplen el predicado:
La principal diferencia con la función size es que ésta última crea una lista intermedia por lo que es menos eficiente que el count.
- Find
Retorna el primer elemento que cumple el predicado si hay muchos o null si no hay ninguno:
Con todo lo anterior entendido, ya tenemos los conocimientos básicos de este tipo de funciones para aplicarlas en nuestra futura práctica de Android. Durante los siguientes post iremos creando una aplicación usando solo código Kotlin y sin una pizca de Java. No olvides leer los dos post anteriores de introducción para poder seguir sin problemas: