Tipos Función En Kotlin

ANUNCIO
Loading...

En este tutorial discutiremos sobre los tipos función en Kotlin (en inglés function types), con el fin de entender como las funciones pueden ser pasadas como argumentos y ser retornadas en expresiones.

Definición De Tipos Función En Kotlin

El tipo función (FT) es el tipo de una variable o parámetro, a los cuales se les ha asignado o puede asignar una función.

O el tipo para un argumento o resultado de retorno de una función de orden superior.

Esta capacidad de usar a las funciones como valores es posible gracias a la interfaz kotlin.Function de Kotlin.

Sintaxis De Tipos Función

La declaración de un tipo función en su forma base, se compone de los tipos de los argumentos que toma en paréntesis, el operador -> y el tipo que retorna.

FT(A1​, … , An​) → R

Por ejemplo, un tipo función cuyo par de argumentos String corresponde un resultado String:

(String, String) -> String
Lenguaje del código: Kotlin (kotlin)

Uno que toma un entero como parámetro pero no tiene retorno particular sería:

(Int) -> Unit
Lenguaje del código: Kotlin (kotlin)

O si existe un tipo función sin parámetros que retorna un Double:

() -> Double
Lenguaje del código: Kotlin (kotlin)

Almacenar Lambda En Variable

Como viste al inicio, el tipo función nos abre un nuevo abanico de posibilidades. Y una de ellas es el almacenamiento de instancias tipo función en variables.

Como caso particular, veamos instancias escritas como funciones lambda .

Por ejemplo, si deseamos juntar el nombre y apellido de un cliente para un formato simple, podemos almacenar la lambda así:

val nombreConFormato = { nombre: String, apellido: String -> "$nombre $apellido"} }
Lenguaje del código: Kotlin (kotlin)

La declaración anterior omite el tipo, ya que el compilador lo puede inferir, pero explícitamente se vería así.

val nombreConFormato: (String, String) -> String= { nombre: String, apellido: String -> "$nombre $apellido"} }
Lenguaje del código: Kotlin (kotlin)
Tipo función en Kotlin

Debido a que la función lambda usa una lista de dos parámetros String y retorna la concatenación de ambos, el tipo función es (String, String) -> String.

Invocar Una Instancia De Tipo Función

Puedes llamar la lambda de una variable de tipo función como una función normal o usar el operador invoke().

Por ejemplo, ejecutemos la función lambda anterior.

fun main() { // Almacenar lambda en variable val nombreCompleto = { nombre: String, apellido: String -> "$nombre $apellido" } println(nombreCompleto("Laura", "Min")) println(nombreCompleto.invoke("Carlos", "Xhan")) }
Lenguaje del código: Kotlin (kotlin)

La salida será:

Laura Min Carlos Xhan

Usar lambdas almacenados te será de utilidad cuando desees posponer el resultado a tu conveniencia, componer lambdas y por supuesto en funciones de orden superior.

Tipos Función Anulables

Los tipos función también pueden ser anulables. La sintaxis para su declaración es recubrir el tipo y agregar ?.

(()->Int)? // Agrega ? al final
Lenguaje del código: Kotlin (kotlin)

Por ejemplo, almacenemos una función lambda en la variable getStars, que dependa de la condición de si el usuario pagó por estrellas. Si es así, calculamos la cantidad, de lo contrario no se asignarán sentencias ejecutables.

fun main() { val payment = 10 val getStars: ((Int) -> Int)? = if (payment > 0) { cost: Int -> cost * 10 } else null // Invocar instancia de tipo función if (getStars != null) { print("Estrellas recibidas:${getStars(10)}") } }
Lenguaje del código: Kotlin (kotlin)

Al correr la aplicación tendrás:

Estrellas recibidas:100
Lenguaje del código: CSS (css)

Pero si cambias el valor de payment a 0 no se ejecutará nada.

Obviamente también puedes usar el operador de acceso seguro como cualquier tipo anulable. Llama a invoke() para habilitar el uso del operador:

getStars?.invoke(10)
Lenguaje del código: Kotlin (kotlin)

¿Ha sido útil esta publicación?