Lambdas Con Recibidor En Kotlin

ANUNCIO
Loading...

En este tutorial te explicaremos la sintaxis y uso para lambdas con recibidor en Kotlin.

Tipo Función Con Recibidor

Un tipo función con recibidor es aquel que agrega a la sintaxis base un tipo recibidor. Este es denotado por un punto antes de la lista de argumentos:

TipoRecibidor.(Arg1, Arg2, ... , ArgN) -> TipoRetorno

La función expresada por este tipo particular, puede ser llamada desde un objeto del tipo del recibidor.

Como notarás, la sintaxis de recibidor puede ser vista como un tipo función de funciones de extensión.

Por ejemplo:

String.(Char) -> String

El tipo función con recibidor anterior representa a una función que puede ser llamada desde un objeto String, con un parámetro Char y retorno String.

Lambda Con Recibidor

Crear una función lambda a partir de un tipo función con recibidor, otorga la posibilidad de acceder al recibidor dentro del cuerpo de la función.

Por ejemplo:

Supongamos que deseamos añadir un mismo carácter al inicio y al final de un string.

fun main() {
    val mapMessage: String.(Char) -> String = { it + this + it }

    println("Mensaje".mapMessage('*'))
}

El código anterior almacena una función lambda con recibidor, equivalante a una función de extensión para la clase String.

La asignación del cuerpo de función muestra el uso de this para referirse al objeto recibidor del que estaremos llamando la función. En este caso "Mensaje".

Pasamos un asterisco como argumento y así mapear el mensaje en el siguiente resultado:

*Mensaje*

Más adelante verás que algunas las funciones de alcance como run, with o apply en Kotlin, usan tipos función con recibidor.

Intercambio De Sintaxis

Los tipos función con recibidor pueden ser interpretados en su sintaxis básica sin el punto de acompañamiento (o viceversa).

La instancia de la lambda anterior puede ejecutarse de la forma alternativa:

println(mapMessage("Mensaje", '*'))

El compilador de Kotlin entenderá el reemplazo del recibidor por un argumento adicional:

(String, Char) -> String

¿Ha sido útil esta publicación?