Icono del sitio Develou

Funciones inline En Kotlin

En este tutorial aprenderás sobre de las funciones inline en Kotlin, para reducir la carga de procesamiento que es empleada en el uso de lambdas.

Sobrecarga En Funciones De Orden Superior

Recordemos que Kotlin trata a las funciones como objetos, por lo que al crear una lambda se genera una nueva clase anónima implícitamente. Y si recibe parámetros, entonces se creará un objeto en cada invocación distinta.

Este comportamiento de forma acumulativa puede llegar a provocar una sobrecarga en tiempo de ejecución, si la función de orden superior es usada frecuentemente.

Así que ¿cómo pasar tus lambdas sin perder rendimiento?

El Modificador inline

Para evitar el comportamiento descrito, marca a tus funciones con el modificador inline.

Una función inline o función en línea le dice al compilador que substituya cada lugar donde es llamada, por el código de implementación de la misma.

El modificador afecta tanto a la función marcada como a los lambdas pasados como argumentos. La suma de sentencias es reemplazada en la llamada de la función.

Por ejemplo:

Marca como inline a la función vista en el tutorial de funciones de orden superior:

inline fun playEffectCard(
    cardCost1: Int,
    cardCost2: Int,
    onSuccess: () -> Unit,
) {
    if (cardCost1 > cardCost2) {
        onSuccess()
    } else {
        println("Sin efectos")
    }
}

Esta recibe una función lambda como argumento para representar la acción al ser efectiva la comparación de dos costos de cartas.

Normalmente veremos su llamada así:

fun main() {
    val warriorCardCost = 1
    val randomDeckCardCost = 4

    playEffectCard(warriorCardCost, randomDeckCardCost) {
        print("Aumentar armadura por 10")
    }
}

Pero internamente, el compilador insertará el código en tiempo de compilación. Similar a lo siguiente:

fun main() {
    val warriorCardCost = 1
    val randomDeckCardCost = 4

    if (warriorCardCost > randomDeckCardCost) {
        print("Aumentar armadura por 10")
    } else {
        println("Sin efectos")
    }
}

De esta forma evitas la creación de una nueva clase para el parámetro onSuccess:() -> Unit.

Salir de la versión móvil