Range adalah konstruksi yang merepresentasikan deret nilai di antara dua batas. Kotlin menyediakan operator .. untuk membuat range inklusif, downTo untuk urutan menurun, until untuk batas atas eksklusif, dan step untuk mengatur lompatan. Di balik layar, sebagian besar range adalah Progression — objek yang menyimpan nilai awal, nilai akhir, dan langkah. Pada chapter ini kita akan membentuk berbagai jenis range, memeriksa keanggotaan dengan in dan !in, serta melihat tipe-tipe seperti IntRange, CharRange, dan LongRange.

Range Naik, Turun, dan Eksklusif #

Operator .. membuat range naik yang inklusif di kedua ujung. downTo menghasilkan range menurun, sementara until membuat range yang batas atasnya tidak ikut termasuk.

kotlin
fun main() {
    // Range naik: 1..10 inklusif di kedua ujung
    println("Range 1..10:")
    for (i in 1..10) print("$i ")
    println()

    // Range turun: downTo
    println("Range 10 downTo 1:")
    for (i in 10 downTo 1) print("$i ")
    println()

    // until: batas atas eksklusif
    println("Range 1 until 5 (batas atas eksklusif):")
    for (i in 1 until 5) print("$i ")
    println()

    // step: lompatan
    println("Range 0..20 step 4:")
    for (i in 0..20 step 4) print("$i ")
    println()

    println("Range 20 downTo 0 step 5:")
    for (i in 20 downTo 0 step 5) print("$i ")
    println()

    // CharRange
    println("CharRange 'a'..'e':")
    for (ch in 'a'..'e') print("$ch ")
    println()

    // LongRange
    println("LongRange 1_000L..1_003L:")
    for (n in 1_000L..1_003L) print("$n ")
    println()

    // Mengecek keanggotaan elemen pada range
    val rentang = 1..100
    println("50 in 1..100? ${50 in rentang}")
    println("150 in 1..100? ${150 in rentang}")
    println("0 !in 1..100? ${0 !in rentang}")

    // Tipe-tipe progression yang dihasilkan
    val a: IntRange = 1..10
    val b: IntProgression = 1..10 step 2
    val c: CharRange = 'a'..'z'
    val d: LongRange = 1L..1_000L
    println("IntRange: $a, first=${a.first}, last=${a.last}")
    println("IntProgression step 2: $b, first=${b.first}, last=${b.last}, step=${b.step}")
    println("CharRange: $c, first=${c.first}, last=${c.last}")
    println("LongRange: $d, first=${d.first}, last=${d.last}")
}

Output yang Dihasilkan:

text
Range 1..10:
1 2 3 4 5 6 7 8 9 10 
Range 10 downTo 1:
10 9 8 7 6 5 4 3 2 1 
Range 1 until 5 (batas atas eksklusif):
1 2 3 4 
Range 0..20 step 4:
0 4 8 12 16 20 
Range 20 downTo 0 step 5:
20 15 10 5 0 
CharRange 'a'..'e':
a b c d e 
LongRange 1_000L..1_003L:
1000 1001 1002 1003 
50 in 1..100? true
150 in 1..100? false
0 !in 1..100? true
IntRange: 1..10, first=1, last=10
IntProgression step 2: 1..9 step 2, first=1, last=9, step=2
CharRange: a..z, first=a, last=z
LongRange: 1..1000, first=1, last=1000

Mari kita bedah baris-baris penting:

  1. 1..10: range inklusif. Mencakup 1, 2, 3, …, 10. Kedua batas ikut serta.
  2. 10 downTo 1: range menurun dari 10 sampai 1. Operator downTo adalah fungsi infix yang mengembalikan IntProgression dengan step -1.
  3. 1 until 5: range 1 sampai 4 (5 tidak termasuk). until berguna untuk iterasi berbasis indeks yang tidak boleh menyentuh panjang list.
  4. 0..20 step 4: lompatan 4, menghasilkan 0, 4, 8, …, 20. step mengubah properti step pada IntProgression.
  5. 'a'..'e': CharRange bekerja pada karakter. Berguna untuk iterasi alfabet atau pengecekan rentang huruf.
  6. 1_000L..1_003L: LongRange untuk angka besar. Tipe literal L wajib untuk Long.
  7. 50 in rentang: operator in memanggil contains(rentang, 50). Operator !in adalah negasinya.
  8. val b: IntProgression = 1..10 step 2: walau berasal dari IntRange, penggunaan step mengubahnya menjadi IntProgression murni (bukan IntRange). Properti first, last, dan step tersedia pada semua progression.

Operator .., until, downTo, step #

OperatorSintaksBatas atasArah
..a..bInklusifNaik
untila until bEksklusifNaik
downToa downTo bInklusifTurun
stepa..b step nSesuai rentang awalMengikuti rentang

IntRange vs IntProgression #

IntRange adalah IntProgression dengan step = 1. Setiap IntRange juga merupakan IntProgression, tetapi kebalikannya tidak selalu benar: 1..10 step 2 adalah IntProgression tanpa menjadi IntRange. Properti first dan last tetap tersedia pada keduanya.

Tipe Range Utama #

TipeContohPenggunaan
IntRange1..100skor, jam, indeks
LongRange1L..1_000Lid besar, ukuran
CharRange'a'..'z'alfabet
IntProgression1..10 step 2lompatan
LongProgression10L downTo 0L step 5Llompatan pada Long

Keanggotaan dengan in dan !in #

Range sangat cocok dipakai bersama when dan in untuk klasifikasi nilai numerik. Kita telah membahasnya pada chapter when-dengan-range. Pola yang sama berlaku untuk validasi: cek apakah usia in 17..65, kodePos in 10000..99999, atau huruf in 'A'..'Z'.

Referensi Lanjutan #

  • Ranges — panduan resmi range dan progression IntProgression

Range dan progression menjadi pondasi banyak konstruksi iterasi di Kotlin. Chapter berikutnya akan membahas break dan continue — dua keyword yang mengatur alur keluar dan pelompatan iterasi di dalam loop.