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:
| Operator | Sintaks | Hasil | Inklusif batas atas? |
|---|---|---|---|
.. | 1..10 | 1, 2, ..., 10 | Ya |
until | 1 until 10 | 1, 2, ..., 9 | Tidak |
downTo | 10 downTo 1 | 10, 9, ..., 1 | Ya |
step | 1..10 step 2 | 1, 3, 5, 7, 9 | Ya (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 #
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:
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 = 55Mari kita bedah bagian-bagian kode di atas:
1..10membentukIntRangedari1sampai10inklusif di kedua ujung. Property5 in rentang1memeriksa apakah5berada di dalam rentang, yang menghasilkantrue.1 until 10membentukIntRangedari1sampai9, tidak termasuk10. Berguna ketika kita ingin iterasi indeks array tanpa melewati batas.10 in rentang2menghasilkanfalse.10 downTo 1membentukIntProgressionyang menurun dari10ke1. Loopformencetak setiap nilai, menghasilkan10 9 8 ... 1.1..10 step 2membentuk progresi dengan lompatan dua, menghasilkan1, 3, 5, 7, 9.stepmengembalikan objekIntProgressionbaru, bukan mengubah rentang asli.10 downTo 1 step 3menghasilkan10, 7, 4, 1. KombinasidownTodanstepsangat berguna untuk iterasi mundur dengan lompatan.'a'..'e'membentukCharRange. SetiapCharantara'a'dan'e'diiterasi mengikuti urutan Unicode. Cocok untuk iterasi alfabet.1L..3LmembentukLongRange. Tipe ini cocok untuk rentang angka besar seperti stempel waktuepoch.(1..10).sum()memanfaatkan ekstensisum()padaIntRange. 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:
| Tipe | Untuk tipe elemen | Penyimpanan |
|---|---|---|
IntRange | Int | Dua bilangan Int (first, last) |
LongRange | Long | Dua bilangan Long |
CharRange | Char | Dua Char |
UIntRange, ULongRange | Unsigned | Varian 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.
val data = listOf("a", "b", "c", "d", "e")
val potongan = data.subList(1, 4) // ["b", "c", "d"]Referensi Lanjutan #
- Ranges
— panduan resmi operator
..danuntiluntuk membuat range - Operator overloading
— konvensi
rangeTooperator yang mendasari..
Dengan menguasai keempat operator rentang beserta tipe khususnya, kita siap memeriksa keanggotaan nilai menggunakan operator in dan !in pada chapter berikutnya.