0Pricing
Kotlin Academy · Lección

Funciones inline: eliminar la sobrecarga de las lambdas

Marque funciones como inline para evitar crear objetos para sus parámetros lambda.

Funciones inline: eliminar la sobrecarga de las lambdas es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué es una función inline?

Normalmente, una lambda que se pasa a una función se compila como una clase anónima. Cada invocación asigna un objeto nuevo, lo que consume memoria y tiempo. La palabra clave inline indica al compilador que copie el cuerpo de la función (y sus argumentos lambda) directamente en el punto de llamada.

Declaración de inline

Añada el modificador inline delante de fun:

inline fun measureTime(block: () -> Unit): Long {
    val start = System.nanoTime()
    block()
    return System.nanoTime() - start
}

Cómo reescribe el compilador la llamada

Una llamada como measureTime { doWork() } se convierte, en el nivel del bytecode, en el cuerpo de measureTime insertado inline; nunca se asigna un objeto lambda.

Cuándo usar inline

Use inline cuando:

  • La función recibe uno o más parámetros lambda
  • Se llama con frecuencia en rutas críticas (bucles estrechos, composables)
  • Necesita parámetros de tipo reified (que se explican a continuación)

Ejemplo de evaluación comparativa del rendimiento

Sin inline, cada llamada a una función de orden superior asigna un objeto lambda. Con él, la JVM ve código lineal: no hay asignación ni despacho virtual.

inline fun repeat(n: Int, block: () -> Unit) {
    for (i in 0 until n) block()
}

Retornos no locales

Una ventaja clave de las funciones inline es que la lambda puede usar return para salir de la función envolvente, no solo de la lambda. Esto se denomina retorno no local.

inline fun forEach(list: List<Int>, block: (Int) -> Unit) {
    for (item in list) block(item)
}

fun findFirst(list: List<Int>): Int {
    forEach(list) { if (it > 5) return it }  // returns from findFirst
    return -1
}

Limitaciones de inline

Las funciones inline no se pueden almacenar en variables ni pasar como objetos porque no existen como entidades de primera clase en tiempo de ejecución. No puede llamar a f(::measureTime) cuando f espera una referencia de función con esa signatura.

Inserción inline en pipelines de colecciones

Las funciones de la biblioteca estándar map, filter, forEach, etc. son todas inline. Por eso encadenarlas no crea objetos de cierre adicionales para cada elemento.

val result = (1..1_000_000)
    .filter { it % 2 == 0 }   // inline
    .map { it * it }           // inline
    .take(10)

Compromiso con el tamaño del código

Cada punto de llamada recibe una copia del código insertado inline. Si el cuerpo de la función es grande y se llama desde muchos lugares, aumenta el tamaño del bytecode. Prefiera inline para lambdas pequeñas a las que se llame con frecuencia.

Interacción con companion y top-level

inline funciona con funciones de nivel superior y funciones miembro. No funciona con propiedades ni constructores. La función debe ser visible en el punto de llamada (normalmente public o internal).

Ejemplos de la biblioteca estándar

Algunas funciones inline que ya conoce: let, run, apply, also, with, use, synchronized y lazy (variante de bloque). El modificador inline es lo que hace que sus lambdas no tengan coste.

Comprobación rápida

¿Cuál es la principal ventaja de marcar una función de orden superior como inline?

Resumen: funciones inline

Conclusiones principales:

  • inline elimina la asignación de objetos lambda
  • Permite retornos no locales desde las lambdas
  • Es necesario para los parámetros de tipo reified
  • Es más adecuado para funciones de orden superior pequeñas y llamadas con frecuencia
  • Las funciones de ámbito de la biblioteca estándar son todas inline

Preguntas frecuentes

¿La lección «Funciones inline: eliminar la sobrecarga de las lambdas» es gratis?

Sí — el texto completo de «Funciones inline: eliminar la sobrecarga de las lambdas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Funciones inline: eliminar la sobrecarga de las lambdas»?

Marque funciones como inline para evitar crear objetos para sus parámetros lambda. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Kotlin Academy?

No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Funciones inline: eliminar la sobrecarga de las lambdas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?

Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Funciones inline: eliminar la sobrecarga de las lambdas
  2. Modificadores noinline y crossinline
  3. Parámetros de tipo reified: acceder a T en tiempo de ejecución
  4. Patrones reified prácticos: análisis, DI y serialización
← Volver a Kotlin Academy