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.