Kotlin Tips - Destructuring declaration

La desestructuración en Kotlin es algo que pasa desapercibido pero es muy útil, sobre todo en la legibilidad del codigo, algo muy importante en el desarrollo de software

Suelo verlo en personas que vienen de lenguajes como Java, en el cual hacen cosas como esta en Kotlin:

val user = "Alberto:Rivas"
val split = user.split(":")
val name = split[0] //Alberto 
val surname = split[1] //Rivas

El equivalente a esto en Java sería prácticamente igual:

String user = "Alberto:Rivas";
String[] split = user.split(":");
String name = split[0]; //Alberto
String surname = split[1]; //Rivas

Para mejorar la legivilidad del código y usar algo 100% Kotlin, podemos aplicar desestructuración:

val user = "Alberto:Rivas"
val (name, surname) = user.split(":")
println("$name $surname") // Alberto Rivas

Ejemplos

A continuación podrás ver mas ejemplos de cómo usar la desestructuración:

  • Pair:

    val (name, surname) = Pair("Alberto", "Rivas")
    println("$name $surname") // Alberto Rivas
    
  • Triple

    val (name, surname, age) = Triple("Alberto", "Rivas", "30")
    println("Nombre: $name, Apellidos: $surname, Edad: $age")
    // Nombre: Alberto, Apellidos: Rivas, Edad: 30
    
  • Data class

    data class User(
     val name: String = "Alberto",
     val surname: String = "Rivas",
     val age: Int = 30,
     val birthday: String = "22-10-2025",
    )
    
    val (name, surname) = User()
    println("Nombre: $name, Apellidos: $surname")
    // Nombre: Alberto, Apellidos: Rivas
    
  • Loops

    val countries = mapOf(
      "ES" to "España",
      "FR" to "Francia",
      "DE" to "Alemania",
    )
    countries.forEach { (code, country) ->
      println("$code$country")
    }
    // ES → España
    // FR → Francia
    // DE → Alemania
    

¿Cómo funciona?

La desestructuración en Kotlin se basa internamente en un conjunto de funciones especiales llamadas componentN(). Cada una de ellas representa una posición dentro de un objeto y permite acceder a sus valores en orden

Cuando el compilador encuentra una desestructuración, lo que hace en realidad es traducir cada variable a una llamada a una de estas funciones: la primera variable al component1(), la segunda al component2(), y así sucesivamente

El soporte de estas funciones depende del tipo de objeto:

En las data classes, el compilador genera automáticamente una función componentN() por cada propiedad del constructor primario, sin límite

En los tipos de la librería estándar como Pair, Triple o Map.Entry, estas funciones están predefinidas

En el caso de las listas y arrays, solo existen las funciones component1() hasta component5(), lo que significa que únicamente se pueden desestructurar los cinco primeros elementos

Si un tipo no define estas funciones, la desestructuración simplemente no es posible

TipoLímite de componentN()Generado por
data classSin límiteCompilador (uno por propiedad del constructor primario)
Pair2Librería estándar
Triple3Librería estándar
List / ArrayHasta component5()Librería estándar
Map.Entry2 (key, value)Librería estándar
Alberto Rivas

© 2025 albrivas

LinkedIn GitHub