Destructuring declaration — apa itu, sintaksis dan penerapan di Kotlin

Penulis: IT Sectr Diterbitkan: 2026-06-23 Waktu membaca: 7 mnt

Destructuring declaration — adalah kemampuan Kotlin untuk mengurai objek menjadi beberapa variabel dalam satu ekspresi. Konstruksi val (name, age) = user secara bersamaan mendeklarasikan dua variabel, menetapkan nilai dari komponen objek. Menurut dokumentasi Kotlin (2026), destructuring mengurangi volume kode saat bekerja dengan data class sebesar 30–50%. Destructuring declaration membuat kode lebih ringkas dan mudah dibaca.

Poin utama

  • Destructuring declaration — sintaksis val (a, b) = obj untuk mengurai objek menjadi variabel
  • ComponentN() — fungsi component1(), component2(), component3() dan seterusnya, dipanggil secara otomatis
  • Data class secara otomatis menghasilkan componentN() untuk semua properti yang dideklarasikan di primary constructor
  • Pair dan Triple — kelas standar dengan destructuring siap pakai untuk dua dan tiga nilai
  • Map.Entry — mendukung destructuring menjadi key dan value untuk penelusuran yang nyaman

Apa itu destructuring declaration?

Destructuring declaration (deklarasi destructuring) — adalah konstruksi sintaksis Kotlin yang memungkinkan Anda mengurai instance kelas menjadi beberapa variabel dalam satu ekspresi. Sisi kiri berisi daftar variabel dalam tanda kurung, sisi kanan — objek yang akan diurai. Kotlin secara otomatis memanggil untuk setiap variabel fungsi componentN() yang sesuai, di mana N adalah nomor urut variabel dalam tanda kurung.

Destructuring declaration paling sering digunakan dengan data class. Kompiler Kotlin secara otomatis menghasilkan untuk data class fungsi component1(), component2() dan seterusnya — sesuai dengan jumlah properti di constructor utama. Untuk kelas biasa tanpa modifier data, componentN() tidak dihasilkan, tetapi dapat didefinisikan secara manual sebagai fungsi operator dengan kata kunci operator.

Destructuring declaration telah menjadi pola populer karena kemampuannya untuk menyederhanakan kode saat bekerja dengan koleksi pasangan, hasil fungsi, dan penelusuran Map. Alih-alih menulis person.firstName, person.lastName, pengembang menulis val (firstName, lastName) = person. Ini mengurangi jumlah baris dan meningkatkan keterbacaan, terutama dalam perulangan dan lambda.

Bagaimana cara kerja destructuring di Kotlin?

Saat menemukan konstruksi val (a, b) = obj, kompiler Kotlin menghasilkan kode: val a = obj.component1(); val b = obj.component2(). Jika variabel dideklarasikan dengan var, penugasan var akan dihasilkan. Tipe setiap variabel disimpulkan dari tipe kembalian fungsi componentN() yang sesuai. Ini berarti destructuring declaration sepenuhnya aman tipe dan diperiksa pada tahap kompilasi.

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 tahun")
}

Dalam listing Person — data class dengan tiga properti. Kotlin menghasilkan component1() → firstName, component2() → lastName, component3() → age. Ekspresi val (firstName, lastName, age) = person memanggil fungsi-fungsi ini dan menetapkan hasilnya. Penting: nama variabel mungkin tidak cocok dengan nama properti — kompiler hanya melihat urutan componentN() dan tipenya. Anda hanya dapat mengurai N properti pertama, mengabaikan sisanya.

Destructuring data class dan tipe standar

Data class — kandidat utama untuk destructuring declaration. Setiap data class secara otomatis mendapatkan componentN() untuk semua properti constructor utama. Urutan componentN() sesuai dengan urutan deklarasi properti. Ini berarti saat mengubah urutan bidang di data class, urutan variabel dalam destructuring berubah — yang dapat menyebabkan bug yang tidak terlihat.

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

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

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

Pair dan Triple — kelas standar dengan destructuring siap pakai untuk dua dan tiga komponen. Pair sering digunakan sebagai tipe kembalian fungsi yang perlu mengembalikan dua nilai terkait tanpa membuat data class terpisah. Dalam perulangan for pada Map.Entry, konstruksi (k, v) = entry mengurai kunci dan nilai melalui component1() dan component2(). Ini adalah pola standar untuk menelusuri Map di Kotlin, yang sepenuhnya menggantikan panggilan eksplisit key dan value.

Garis bawah untuk variabel yang tidak digunakan

Jika dalam destructuring beberapa komponen tidak diperlukan, Kotlin memungkinkan untuk menggantinya dengan garis bawah _. Ini meningkatkan keterbacaan — pembaca langsung melihat bahwa komponen diabaikan. Selain itu, penggunaan _ mencegah akses tidak sengaja ke variabel yang belum diinisialisasi: kompiler tidak membuat variabel apa pun untuk _, yang menghilangkan peringatan tentang variabel yang tidak digunakan.

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("Pesanan $id: $amount")
    }
}

Dalam listing Order memiliki empat properti, tetapi dalam perulangan hanya id dan amount yang diperlukan. Garis bawah di tempat customerName memberi tahu kompiler “lewati component2()”. Kotlin tidak memanggil component2() dan tidak membuat variabel untuk komponen ini. Penting: garis bawah hanya dapat digunakan dalam destructuring declaration, tetapi tidak di constructor data class. Jika beberapa komponen dilewati berturut-turut, masing-masing memiliki garis bawah sendiri.

Membuat componentN() untuk kelas sendiri

Untuk kelas tanpa modifier data, Anda dapat mendefinisikan componentN() secara manual dengan menambahkan kata kunci operator. Ini memungkinkan penggunaan destructuring declaration dengan kelas apa pun, termasuk kelas pihak ketiga yang kode sumbernya tidak dapat diubah — cukup tulis fungsi ekstensi dengan operator. Pendekatan ini sangat berguna untuk kelas pustaka dan kelas dari kode Java yang tidak memiliki componentN() otomatis.

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

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

// Untuk kelas Java dengan getter
operator fun Dimension.component1(): Int = width
operator fun Dimension.component2(): Int = height

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

Dalam contoh Rect — kelas biasa tanpa data. Fungsi ekstensi dengan operator fun component1() = width dan component2() = height menambahkan dukungan destructuring. Demikian pula untuk java.awt.Dimension: ekstensi operator pada Dimension memungkinkan penguraiannya menjadi width dan height. Keterbatasan: jumlah maksimum komponen untuk destructuring declaration — 5. Secara teoritis Anda dapat mendefinisikan component6() dan lebih tinggi, tetapi Kotlin tidak akan menghasilkan sintaksis yang sesuai untuk 6+ variabel dalam tanda kurung.

Pertanyaan yang sering diajukan

Apakah setiap data class mendukung destructuring?

Ya, setiap data class secara otomatis mendapatkan componentN() untuk semua properti constructor utama. Properti yang dideklarasikan di badan kelas (melalui constructor tanpa val/var) tidak menghasilkan componentN().

Apa yang terjadi jika jumlah variabel tidak cocok?

Jika dalam val (a, b, c) = obj objek hanya memiliki dua fungsi component, kompiler akan memberikan kesalahan. Jika variabel lebih sedikit (val (a) = pair), Kotlin hanya akan memanggil component1() dan mengabaikan component2() — kesalahan tidak akan terjadi.

Bisakah Map di-destructure tanpa perulangan?

Ya, Map.Entry mendukung destructuring: val (key, value) = map.entries.first(). Untuk seluruh Map sekaligus destructuring tidak berfungsi — hanya elemen per elemen, dalam perulangan for atau melalui iterator.

Apakah destructuring berfungsi dalam lambda?

Ya, Kotlin mendukung destructuring dalam parameter lambda: map.forEach { (k, v) -> ... }. Untuk data class dalam parameter lambda, Anda perlu menambahkan tanda kurung bersarang di sekitar parameter.

Berapa ukuran maksimum destructuring?

Kotlin mendukung hingga 5 variabel dalam destructuring declaration. Jika Anda perlu mengurai lebih dari lima properti, gabungkan dalam data class bersarang atau gunakan Pair/Triple di dalam satu variabel.

Ringkasan

  • Destructuring declaration — sintaksis val (a, b) = obj, mengurai objek menjadi beberapa variabel dalam satu ekspresi
  • ComponentN() — fungsi component1(), component2(), ... dipanggil oleh kompiler secara otomatis saat destructuring
  • Data class secara otomatis menghasilkan componentN() untuk semua properti constructor utama
  • Pair dan Triple — kelas standar dengan destructuring siap pakai untuk 2 dan 3 komponen
  • Garis bawah _ menggantikan komponen yang tidak digunakan tanpa membuat variabel
  • Operator componentN() dalam fungsi ekstensi menambahkan destructuring ke kelas apa pun, termasuk Java
  • Map.Entry dalam perulangan for ((k, v) in map) — pola idiomatis standar Kotlin untuk menelusuri kamus

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga