O que é Lambda em Kotlin?

Uma lambda é uma função anônima — uma função sem nome que pode ser tratada como valor. Você pode armazená-la em variáveis, passá-la como argumento ou retorná-la de outra função. Lambdas são a base da programação funcional em Kotlin.

A sintaxe é simples: tudo fica entre chaves {}, com os parâmetros antes da seta -> e o corpo depois.

Sintaxe básica

val saudacao = { nome: String -> "Olá, $nome!" }

fun main() {
    println(saudacao("Karina"))  // Olá, Karina!
}

Lambda como argumento

O uso mais comum de lambdas é como argumento de funções, especialmente com coleções:

fun main() {
    val numeros = listOf(1, 2, 3, 4, 5, 6)

    val pares = numeros.filter { it % 2 == 0 }
    println(pares) // [2, 4, 6]

    val dobrados = numeros.map { it * 2 }
    println(dobrados) // [2, 4, 6, 8, 10, 12]
}

Quando a lambda tem um único parâmetro, você pode usar it em vez de declarar o nome.

Trailing lambda

Se o último parâmetro de uma função é uma lambda, você pode escrevê-la fora dos parênteses:

val nomes = listOf("Ana", "Bruno", "Carla")

// Essas duas formas são equivalentes:
nomes.forEach({ println(it) })
nomes.forEach { println(it) }  // Mais idiomático

Essa convenção deixa o código mais limpo e é usada em toda parte no Kotlin.

Lambda com múltiplos parâmetros

val soma = { a: Int, b: Int -> a + b }
println(soma(3, 7)) // 10

val nomes = mapOf("BR" to "Brasil", "PT" to "Portugal")
nomes.forEach { (codigo, pais) ->
    println("$codigo -> $pais")
}

Lambda com receiver

Kotlin suporta lambdas com receiver, que são a base das DSLs:

fun construirTexto(bloco: StringBuilder.() -> Unit): String {
    val sb = StringBuilder()
    sb.bloco()
    return sb.toString()
}

fun main() {
    val texto = construirTexto {
        append("Kotlin ")
        append("Brasil!")
    }
    println(texto) // Kotlin Brasil!
}

Lambdas estão por toda parte no Kotlin. Dominar essa sintaxe é essencial pra escrever código idiomático e produtivo.