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 -
Tripleval (name, surname, age) = Triple("Alberto", "Rivas", "30") println("Nombre: $name, Apellidos: $surname, Edad: $age") // Nombre: Alberto, Apellidos: Rivas, Edad: 30 -
Data classdata 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 -
Loopsval 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
| Tipo | Límite de componentN() | Generado por |
|---|---|---|
data class | Sin límite | Compilador (uno por propiedad del constructor primario) |
Pair | 2 | Librería estándar |
Triple | 3 | Librería estándar |
List / Array | Hasta component5() | Librería estándar |
Map.Entry | 2 (key, value) | Librería estándar |