Saltar a contenido

Expresiones Lambda en Kotlin

Las expresiones lambda son funciones anónimas (sin nombre) que se pueden pasar como valores.
Son utilizadas principalmente en funciones de orden superior, es decir, funciones que reciben otras funciones como parámetros.

En Kotlin, las lambdas se utilizan constantemente: en listas, en Compose, en callbacks, en eventos y en programación funcional.

¿Qué es una expresión lambda?

Una lambda es una función anónima con esta sintaxis:

{ parámetros -> cuerpo }

Ejemplo básico:

val saludo = { nombre: String -> "Hola, $nombre" }
println(saludo("Ginés"))

Función de orden superior: ejemplo base

Vamos a crear una función de orden superior llamada operar, que reciba:

  • dos enteros
  • una función (Int, Int) -> Int
fun operar(a: Int, b: Int, funcion: (Int, Int) -> Int): Int {
    return funcion(a, b)
}

Enviar lambdas como argumento

fun main() {
    val suma = operar(10, 5) { x, y -> x + y }
    val resta = operar(10, 5) { x, y -> x - y }
    val potencia = operar(2, 4) { x, y -> x.toDouble().pow(y).toInt() }

    println("Suma: $suma")
    println("Resta: $resta")
    println("Potencia: $potencia")
}

Tipos de parámetro: con o sin tipo

Kotlin puede inferir tipos, así que esto es válido:

operar(3, 4) { x, y -> x * y }

Y también:

operar(3, 4) { x: Int, y: Int -> x * y }

Renombrar parámetros

operar(5, 2) { primero, segundo -> primero - segundo }

Trailing lambda (lambda al final)

val resultado = operar(6, 3) { x, y -> x / y }

Lambdas de un solo parámetro → uso de it

val alCuadrado: (Int) -> Int = { it * it }
println(alCuadrado(5)) // 25

9.8 Acceso a variables externas

var contador = 0

val incrementar = {
    contador++
}

incrementar()
incrementar()
println(contador) // 2

Ejemplo completo integrando todo

fun operar(a: Int, b: Int, op: (Int, Int) -> Int): Int = op(a, b)

fun main() {
    var factor = 3

    val multiplicar = operar(4, 5) { x, y -> (x * y) * factor }

    println(multiplicar) // (4 * 5) * 3 = 60
}

Actividades

  • AC 502 (RA2 / CE2a / IC1 / 1p). Crea una función de orden superior calcular(a, b, operacion) y llámala desde main usando lambdas para:

    • sumar
    • restar
    • multiplicar
  • AC 503 (RA2 / CE2a / IC1 / 1p). Crea una lista de enteros y usa una lambda con filter para obtener solo los números pares. Imprime el resultado.

  • AC 504 (RA2 / CE2a / IC1 / 1p). Declara una lambda que reciba un String y devuelva cuántas vocales contiene. Llama a la lambda desde main.