for loop di Kotlin berbeda dengan for tradisional berbasis indeks di C atau Java. Kotlin memperlakukan for sebagai iterasi atas sumber yang menyediakan iterator, sehingga sintaksnya konsisten: for (item in sumber). Sumber iterasi dapat berupa range, list, set, map, string, atau objek apa pun yang mengimplementasikan operator iterator(). Pada chapter ini kita akan mengiterasi range, list, dan map, serta menggunakan indices, withIndex(), dan step untuk skenario iterasi yang lebih kompleks.

Iterasi Range dan List #

Bentuk paling sederhana for (i in 1..5) mengiterasi setiap angka dari 1 hingga 5 inklusif. Untuk list, kita dapat langsung mengiterasi elemennya tanpa perlu mengakses indeks.

kotlin
fun main() {
    // Iterasi range angka
    println("Iterasi 1..5:")
    for (i in 1..5) {
        print("$i ")
    }
    println()

    // Iterasi elemen list
    val buah = listOf("Apel", "Mangga", "Jeruk", "Pisang")
    println("Daftar buah:")
    for (nama in buah) {
        println("- $nama")
    }

    // Iterasi dengan indeks menggunakan indices
    println("Dengan indeks:")
    for (indeks in buah.indices) {
        println("${indeks + 1}. ${buah[indeks]}")
    }

    // Iterasi dengan withIndex: mendapatkan (index, value)
    println("Dengan withIndex:")
    for ((indeks, nama) in buah.withIndex()) {
        println("Posisi $indeks -> $nama")
    }

    // Iterasi entry map
    val stok = mapOf("Apel" to 12, "Mangga" to 8, "Jeruk" to 15)
    println("Stok buah:")
    for ((nama, jumlah) in stok) {
        println("$nama: $jumlah kg")
    }

    // Iterasi karakter string
    val kata = "Kotlin"
    print("Huruf kata '$kata': ")
    for (ch in kata) {
        print("$ch ")
    }
    println()

    // Iterasi dengan step
    println("Kelipatan 10 dari 0 sampai 50:")
    for (n in 0..50 step 10) {
        print("$n ")
    }
    println()
}

Output yang Dihasilkan:

text
Iterasi 1..5:
1 2 3 4 5 
Daftar buah:
- Apel
- Mangga
- Jeruk
- Pisang
Dengan indeks:
1. Apel
2. Mangga
3. Jeruk
4. Pisang
Dengan withIndex:
Posisi 0 -> Apel
Posisi 1 -> Mangga
Posisi 2 -> Jeruk
Posisi 3 -> Pisang
Stok buah:
Apel: 12 kg
Mangga: 8 kg
Jeruk: 15 kg
Huruf kata 'Kotlin': K o t l i n 
Kelipatan 10 dari 0 sampai 50:
0 10 20 30 40 50

Mari kita bedah baris-baris penting:

  1. for (i in 1..5) print("$i "): range 1..5 menghasilkan IntRange yang menyediakan iterator. Variabel i mengambil setiap nilai secara berurutan.
  2. for (nama in buah) println("- $nama"): list List<String> dapat diiterasi langsung tanpa indeks. Variabel nama bertipe String sesuai tipe elemen list.
  3. for (indeks in buah.indices): property indices mengembalikan IntRange berisi 0..size-1. Cocok ketika kita perlu tahu posisi elemen.
  4. for ((indeks, nama) in buah.withIndex()): withIndex() membungkus setiap elemen menjadi IndexedValue<T>. Dengan destructuring declaration, kita mengikat indeks dan nilai sekaligus dalam satu iterasi.
  5. for ((nama, jumlah) in stok): iterasi pada Map menghasilkan Map.Entry. Destructuring (k, v) mengambil key dan value sekaligus.
  6. for (ch in kata): String menyediakan iterator karakter, sehingga kita dapat mengiterasi huruf demi huruf.
  7. for (n in 0..50 step 10): modifier step mengubah kelipatan iterasi. Hasilnya melompat 0, 10, 20, …, 50.

indices vs withIndex() #

Kedua pendekatan sama-sama memberi akses ke indeks, tetapi withIndex() lebih ringkas karena kita mendapatkan indeks dan nilai dalam satu deklarasi. indices lebih cocok ketika kita ingin kontrol penuh atas akses list melalui indeks.

PendekatanSintaksCocok untuk
Iterasi langsungfor (x in list)tidak perlu indeks
indicesfor (i in list.indices)perlu indeks, akses manual
withIndex()for ((i, x) in list.withIndex())butuh indeks dan nilai sekaligus

Iterasi Map dengan Destructuring #

Iterasi Map di Kotlin menghasilkan Map.Entry yang dapat didestrukturisasi menjadi (kunci, nilai). Bentuk ini lebih ringkas dibanding memanggil entry.key dan entry.value secara terpisah.

Iterasi dengan step #

Modifier step bekerja pada IntProgression, LongProgression, dan CharProgression. Untuk iterasi menurun, gunakan downTo (mis. for (i in 10 downTo 1 step 2)). Detail range dan progression akan kita bedah tuntas pada chapter ranges-dan-progressions.

Referensi Lanjutan #

  • Control flow — panduan resmi for loop dengan iterator di Kotlin

Dengan for yang konsisten untuk berbagai sumber iterasi, kode Kotlin menjadi lebih ringkas dan mudah dipindai. Chapter berikutnya membahas while untuk kasus ketika jumlah iterasi tidak diketahui sejak awal.