O que é Destructuring em Kotlin?

Destructuring (desestruturação) permite decompor um objeto em várias variáveis numa única declaração. Em vez de acessar cada propriedade separadamente, você extrai tudo de uma vez. É prático, limpo e muito usado no dia a dia.

Sintaxe básica com Data Class

data class Endereco(val rua: String, val cidade: String, val estado: String)

fun main() {
    val endereco = Endereco("Rua das Flores", "Recife", "PE")

    val (rua, cidade, estado) = endereco
    println("$rua, $cidade - $estado")
    // Rua das Flores, Recife - PE
}

Funciona porque data classes geram automaticamente as funções component1(), component2(), etc.

Destructuring em Maps

Uma das situações mais comuns é iterar sobre mapas:

fun main() {
    val capitais = mapOf(
        "SP" to "São Paulo",
        "RJ" to "Rio de Janeiro",
        "BA" to "Salvador"
    )

    for ((sigla, capital) in capitais) {
        println("$sigla -> $capital")
    }
}

Bem mais legível do que acessar entry.key e entry.value, concorda?

Destructuring em lambdas

fun main() {
    val pessoas = listOf(
        Pair("Ana", 25),
        Pair("Bruno", 30),
        Pair("Carla", 28)
    )

    pessoas.forEach { (nome, idade) ->
        println("$nome tem $idade anos")
    }
}

Ignorando variáveis com _

Se não precisa de algum componente, use _ pra ignorar:

data class Transacao(val id: String, val valor: Double, val data: String)

fun main() {
    val transacao = Transacao("TX-001", 150.0, "2026-02-15")

    val (_, valor, _) = transacao
    println("Valor: R$ $valor") // Valor: R$ 150.0
}

Criando destructuring em classes próprias

Para classes que não são data class, basta implementar as funções operator componentN():

class Coordenada(val latitude: Double, val longitude: Double) {
    operator fun component1() = latitude
    operator fun component2() = longitude
}

fun main() {
    val (lat, lng) = Coordenada(-8.0476, -34.8770)
    println("Lat: $lat, Lng: $lng")
}

Retornando múltiplos valores

Destructuring combina bem com Pair e Triple pra retornar vários valores de uma função:

fun dividir(a: Int, b: Int): Pair<Int, Int> {
    return Pair(a / b, a % b)
}

fun main() {
    val (quociente, resto) = dividir(17, 5)
    println("Quociente: $quociente, Resto: $resto")
}

Destructuring é um recurso simples que faz uma diferença enorme na legibilidade do código Kotlin.