Rentang (range) adalah salah satu fitur paling ergonomis di Kotlin. Dengan operator .., until, downTo, dan step, kita dapat menyatakan urutan nilai sebagai objek tunggal yang dapat diiterasi. Rentang tidak hanya bekerja pada Int, tetapi juga Long dan Char, dengan tipe khusus seperti IntRange, LongRange, dan CharRange. Pada chapter ini kita akan membahas keempat operator pembentuk rentang, perilaku inklusif/eksklusif, serta penggunaan rentang pada loop for dan operasi koleksi.

Daftar Operator Rentang #

Berikut ringkasan operator yang membentuk rentang:

OperatorSintaksHasilInklusif batas atas?
..1..101, 2, ..., 10Ya
until1 until 101, 2, ..., 9Tidak
downTo10 downTo 110, 9, ..., 1Ya
step1..10 step 21, 3, 5, 7, 9Ya (lompat 2)

Operator .. memanggil function rangeTo(). Operator until dan downTo sebenarnya adalah infix function dari standard library. Operator step adalah infix function yang mengubah rentang menjadi rentang berlompatan dengan jarak yang ditentukan.

Membentuk dan Mengiterasi Rentang #

kotlin
fun main() {
    val rentang1 = 1..10
    println("1..10 contains 5: ${5 in rentang1}")
    println("1..10 contains 15: ${15 in rentang1}")

    val rentang2 = 1 until 10
    println("1 until 10 contains 10: ${10 in rentang2}")
    println("1 until 10 contains 9: ${9 in rentang2}")

    val rentangTurun = 10 downTo 1
    print("10 downTo 1: ")
    for (n in rentangTurun) {
        print("$n ")
    }
    println()

    val lompat = 1..10 step 2
    print("1..10 step 2: ")
    for (n in lompat) {
        print("$n ")
    }
    println()

    val lompatTurun = 10 downTo 1 step 3
    print("10 downTo 1 step 3: ")
    for (n in lompatTurun) {
        print("$n ")
    }
    println()

    val abjad = 'a'..'e'
    print("CharRange 'a'..'e': ")
    for (ch in abjad) {
        print("$ch ")
    }
    println()

    val besar = 1L..3L
    println("1L..3L first: ${besar.first}, last: ${besar.last}")

    val total = (1..10).sum()
    println("Sum 1..10 = $total")
}

Output yang Dihasilkan:

text
1..10 contains 5: true
1..10 contains 15: false
1 until 10 contains 10: false
1 until 10 contains 9: true
10 downTo 1: 10 9 8 7 6 5 4 3 2 1 
1..10 step 2: 1 3 5 7 9 
10 downTo 1 step 3: 10 7 4 1 
CharRange 'a'..'e': a b c d e 
1L..3L first: 1, last: 3
Sum 1..10 = 55

Mari kita bedah bagian-bagian kode di atas:

  1. 1..10 membentuk IntRange dari 1 sampai 10 inklusif di kedua ujung. Property 5 in rentang1 memeriksa apakah 5 berada di dalam rentang, yang menghasilkan true.
  2. 1 until 10 membentuk IntRange dari 1 sampai 9, tidak termasuk 10. Berguna ketika kita ingin iterasi indeks array tanpa melewati batas. 10 in rentang2 menghasilkan false.
  3. 10 downTo 1 membentuk IntProgression yang menurun dari 10 ke 1. Loop for mencetak setiap nilai, menghasilkan 10 9 8 ... 1.
  4. 1..10 step 2 membentuk progresi dengan lompatan dua, menghasilkan 1, 3, 5, 7, 9. step mengembalikan objek IntProgression baru, bukan mengubah rentang asli.
  5. 10 downTo 1 step 3 menghasilkan 10, 7, 4, 1. Kombinasi downTo dan step sangat berguna untuk iterasi mundur dengan lompatan.
  6. 'a'..'e' membentuk CharRange. Setiap Char antara 'a' dan 'e' diiterasi mengikuti urutan Unicode. Cocok untuk iterasi alfabet.
  7. 1L..3L membentuk LongRange. Tipe ini cocok untuk rentang angka besar seperti stempel waktu epoch.
  8. (1..10).sum() memanfaatkan ekstensi sum() pada IntRange. Banyak operasi koleksi (sum, average, minOrNull, maxOrNull) bekerja langsung pada rentang tanpa konversi ke list.

Tipe IntRange, CharRange, dan LongRange #

Kotlin tidak menyatukan semua rentang ke dalam satu class. Sebagai gantinya, kompilator menyediakan tipe khusus untuk performa optimal:

TipeUntuk tipe elemenPenyimpanan
IntRangeIntDua bilangan Int (first, last)
LongRangeLongDua bilangan Long
CharRangeCharDua Char
UIntRange, ULongRangeUnsignedVarian untuk tipe unsigned

Rentang untuk Float dan Double tidak tersedia karena ketepatan pecahan membuat rentang tidak terdefinisi dengan baik. Untuk mengiterasi angka desimal, gunakan loop while atau konversi ke Int terlebih dahulu.

Rentang pada Operasi Koleksi #

Rentang tidak hanya untuk loop. Kita dapat memotong list dengan sintaks list[1..3] (membutuhkan operator get yang menerima IntRange pada List). Pemeriksaan keanggotaan x in 1..10 jauh lebih ringkas dibanding x >= 1 && x <= 10. Untuk koleksi yang lebih besar, gunakan rentang untuk membentuk sub-list atau untuk iterasi batch.

kotlin Contoh: potongan list dengan rentang
val data = listOf("a", "b", "c", "d", "e")
val potongan = data.subList(1, 4) // ["b", "c", "d"]

Referensi Lanjutan #

  • Ranges — panduan resmi operator .. dan until untuk membuat range
  • Operator overloading — konvensi rangeTo operator yang mendasari ..

Dengan menguasai keempat operator rentang beserta tipe khususnya, kita siap memeriksa keanggotaan nilai menggunakan operator in dan !in pada chapter berikutnya.