Destructuring declaration — wat is het, syntaxis en toepassing in Kotlin

Auteur: IT Sectr Gepubliceerd: 2026-06-23 Leestijd: 7 min

Destructuring declaration — is de mogelijkheid van Kotlin om een object in meerdere variabelen in één expressie te ontleden. De constructie val (name, age) = user declareert tegelijkertijd twee variabelen en wijst ze waarden toe uit de componenten van het object. Volgens de Kotlin-documentatie (2026) vermindert destructuring de codehoeveelheid bij het werken met data class met 30–50%. Destructuring declaration maakt de code beknopter en leesbaarder.

Belangrijkste punten

  • Destructuring declaration — syntaxis val (a, b) = obj voor het ontleden van objecten in variabelen
  • ComponentN() — functies component1(), component2(), component3() enzovoort, automatisch aangeroepen
  • Data class genereert automatisch componentN() voor alle eigenschappen gedeclareerd in primary constructor
  • Pair en Triple — standaardklassen met kant-en-klare destructuring voor twee en drie waarden
  • Map.Entry — ondersteunt destructuring op key en value voor gemakkelijk doorlopen

Wat is destructuring declaration?

Destructuring declaration (destructurerende declaratie) — is een syntactische constructie in Kotlin waarmee je een instantie van een klasse in één expressie in meerdere variabelen kunt ontleden. De linkerkant bevat de lijst met variabelen tussen haakjes, de rechterkant — het te ontleden object. Kotlin roept automatisch voor elke variabele de bijbehorende functie componentN() aan, waarbij N het volgnummer van de variabele tussen haakjes is.

Destructuring declaration wordt het vaakst gebruikt met data class. De Kotlin-compiler genereert automatisch voor data class de functies component1(), component2() enzovoort — op basis van het aantal eigenschappen in de primaire constructor. Voor gewone klassen zonder de modifier data worden componentN() niet gegenereerd, maar ze kunnen handmatig worden gedefinieerd als operatorfuncties met het sleutelwoord operator.

Destructuring declaration is een populair patroon geworden vanwege zijn vermogen om code te vereenvoudigen bij het werken met verzamelingen paren, functieresultaten en het doorlopen van Map. In plaats van person.firstName, person.lastName schrijft de ontwikkelaar val (firstName, lastName) = person. Dit vermindert het aantal regels en verhoogt de leesbaarheid, vooral in lussen en lambda's.

Hoe werkt destructuring in Kotlin?

Bij het tegenkomen van de constructie val (a, b) = obj genereert de Kotlin-compiler de code: val a = obj.component1(); val b = obj.component2(). Als variabelen zijn gedeclareerd met var, worden var-toewijzingen gegenereerd. Het type van elke variabele wordt afgeleid van het retourtype van de bijbehorende functie componentN(). Dit betekent dat destructuring declaration volledig typeveilig is en wordt gecontroleerd tijdens de compilatiefase.

kotlin
data class Person(val firstName: String, val lastName: String, val age: Int)

fun main() {
    val person = Person("Alice", "Smith", 30)

    // Destructuring: component1(), component2(), component3()
    val (firstName, lastName, age) = person
    println("$firstName $lastName, $age jaar oud")
}

In de listing Person — data class met drie eigenschappen. Kotlin genereert component1() → firstName, component2() → lastName, component3() → age. De expressie val (firstName, lastName, age) = person roept deze functies aan en wijst de resultaten toe. Belangrijk: variabelenamen kunnen afwijken van eigenschapsnamen — de compiler kijkt alleen naar de volgorde van componentN() en hun typen. Je kunt alleen de eerste N eigenschappen ontleden en de rest negeren.

Destructuring van data class en standaardtypes

Data class — de belangrijkste kandidaat voor destructuring declaration. Elke data class krijgt automatisch componentN() voor alle eigenschappen van de primaire constructor. De volgorde van componentN() komt overeen met de volgorde van declaratie van eigenschappen. Dit betekent dat bij het wijzigen van de veldvolgorde in data class de volgorde van variabelen in destructuring verandert — wat kan leiden tot onzichtbare bugs.

kotlin
// Pair-destructuring
val pair = Pair("key", 42)
val (key, value) = pair
println("$key -> $value")

// Triple-destructuring
val triple = Triple("A", "B", "C")
val (first, second, third) = triple

// Map.Entry in lus
val map = mapOf("a" to 1, "b" to 2)
for ((k, v) in map) {
    println("$k = $v")
}

Pair en Triple — standaardklassen met kant-en-klare destructuring voor twee en drie componenten. Pair wordt vaak gebruikt als retourtype van functies die twee gerelateerde waarden moeten retourneren zonder een aparte data class te maken. In een for-lus over Map.Entry ontleedt de constructie (k, v) = entry de sleutel en waarde via component1() en component2(). Dit is het standaardpatroon voor het doorlopen van Map in Kotlin, dat expliciete aanroepen van key en value volledig vervangt.

Onderstreping voor ongebruikte variabelen

Als bij destructuring sommige componenten niet nodig zijn, staat Kotlin toe ze te vervangen door een onderstreping _. Dit verbetert de leesbaarheid — de lezer ziet meteen dat de component wordt genegeerd. Bovendien voorkomt het gebruik van _ de per ongeluk toegang tot een niet-geïnitialiseerde variabele: de compiler maakt geen variabele voor _, waardoor waarschuwingen over ongebruikte variabelen worden geëlimineerd.

kotlin
data class Order(
    val id: Long,
    val customerName: String,
    val amount: Double,
    val status: String
)

fun process(orders: List<Order>) {
    for ((id, _, amount) in orders) {
        println("Bestelling $id: $amount")
    }
}

In de listing heeft Order vier eigenschappen, maar in de lus zijn alleen id en amount nodig. De onderstreping op de plaats van customerName vertelt de compiler ‘sla component2() over’. Kotlin roept component2() niet aan en maakt geen variabele voor deze component. Belangrijk: onderstreping kan alleen worden gebruikt in destructuring declaration, maar niet in de data class-constructor. Als meerdere componenten achter elkaar worden overgeslagen, heeft elk zijn eigen onderstreping.

Aanmaken van componentN() voor eigen klassen

Voor klassen zonder de modifier data kun je handmatig componentN() definiëren door het sleutelwoord operator toe te voegen. Hiermee kun je destructuring declaration gebruiken met elke klasse, inclusief externe klassen waarvan de broncode niet kan worden gewijzigd — het volstaat om een extensiefunctie met operator te schrijven. Deze benadering is vooral nuttig voor bibliotheekklassen en klassen uit Java-code die geen automatische componentN() hebben.

kotlin
class Rect(val width: Int, val height: Int)

operator fun Rect.component1(): Int = width
operator fun Rect.component2(): Int = height

// Voor Java-klasse met getters
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height

fun main() {
    val rect = Rect(1920, 1080)
    val (w, h) = rect
    println("Resolutie: ${w}x${h}")
}

In het voorbeeld is Rect — een gewone klasse zonder data. Extensiefuncties met operator fun component1() = width en component2() = height voegen ondersteuning voor destructuring toe. Op dezelfde manier voor java.awt.Dimension: een operator-extensie op Dimension maakt het mogelijk deze in width en height te ontleden. Beperking: het maximale aantal componenten voor destructuring declaration is 5. In theorie kun je component6() en hoger definiëren, maar Kotlin zal geen overeenkomstige syntaxis genereren voor 6+ variabelen tussen haakjes.

Veelgestelde vragen

Ondersteunt elke data class destructuring?

Ja, elke data class krijgt automatisch componentN() voor alle eigenschappen van de primaire constructor. Eigenschappen gedeclareerd in de klasse-body (via constructor zonder val/var) genereren geen componentN().

Wat gebeurt er bij een mismatch van het aantal variabelen?

Als in val (a, b, c) = obj het object slechts twee componentfuncties heeft, geeft de compiler een foutmelding. Als er minder variabelen zijn (val (a) = pair), roept Kotlin alleen component1() aan en negeert component2() — er treedt geen fout op.

Kan Map worden gedestructureerd zonder lus?

Ja, Map.Entry ondersteunt destructuring: val (key, value) = map.entries.first(). Voor de gehele Map tegelijk werkt destructuring niet — alleen element voor element, in een for-lus of via een iterator.

Werkt destructuring in lambda's?

Ja, Kotlin ondersteunt destructuring in lambda-parameters: map.forEach { (k, v) -> ... }. Voor data class in lambda-parameters moeten geneste haakjes rond de parameter worden toegevoegd.

Wat is de maximale grootte van destructuring?

Kotlin ondersteunt tot 5 variabelen in destructuring declaration. Als je meer dan vijf eigenschappen moet ontleden, combineer ze dan in geneste data classes of gebruik Pair/Triple binnen één variabele.

Samenvatting

  • Destructuring declaration — syntaxis val (a, b) = obj, ontleedt object in meerdere variabelen in één expressie
  • ComponentN() — functies component1(), component2(), ... automatisch aangeroepen door de compiler bij destructuring
  • Data class genereert automatisch componentN() voor alle eigenschappen van de primaire constructor
  • Pair en Triple — standaardklassen met kant-en-klare destructuring voor 2 en 3 componenten
  • Onderstreping _ vervangt ongebruikte componenten zonder een variabele te maken
  • Operator componentN() in extensiefuncties voegt destructuring toe aan elke klasse, inclusief Java
  • Map.Entry in for ((k, v) in map)-lus — het standaard idiomatische Kotlin-patroon voor het doorlopen van een woordenboek

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook