Salah satu kekuatan when dibanding switch klasik adalah dukungan pencocokan terhadap rentang nilai dengan operator in. Kita dapat menulis in 90..100 -> "Sangat Baik" tanpa perlu mendaftar setiap angka satu per satu. Operator in bekerja pada IntRange, CharRange, LongRange, dan tipe yang menyediakan operator contains. Lawan dari in adalah !in, yang mencocokkan nilai di luar rentang tertentu. Pada chapter ini kita akan membentuk pencocokan range tunggal, kombinasi beberapa range pada satu cabang, serta penggunaan !in untuk negasi.
Pencocokan dengan in #
Operator in menguji apakah nilai berada di dalam rentang inklusif. Pada when, cabang in 90..100 akan terpilih bila subjek berada dalam rentang tersebut, termasuk ujung-ujungnya.
fun main() {
val skor = 75
// when dengan range operator in
val kategori = when (skor) {
in 90..100 -> "Sangat Baik"
in 70..89 -> "Baik"
in 50..69 -> "Cukup"
in 0..49 -> "Kurang"
else -> "Skor di luar jangkauan"
}
println("Skor $skor -> $kategori")
// Kombinasi beberapa range pada satu branch
val jam = 23
val periode = when (jam) {
in 6..10, in 11..14 -> "Jam Sibuk Pagi-Siang"
in 15..18 -> "Jam Sibuk Sore"
in 19..22 -> "Jam Sepi"
in 23..24, in 0..5 -> "Tengah Malam"
else -> "Jam tidak valid"
}
println("Jam $jam -> $periode")
// Operator !in untuk negasi keanggotaan
val kodePos = 55123
val area = when (kodePos) {
in 10000..19999 -> "Jakarta"
in 40000..49999 -> "Banten"
in 50000..59999 -> "Yogyakarta"
!in 10000..99999 -> "Bukan kode pos Indonesia"
else -> "Kode pos lain"
}
println("Kode pos $kodePos -> $area")
// when pada CharRange untuk klasifikasi huruf
val karakter = 'e'
val jenisHuruf = when (karakter) {
in 'a'..'z' -> "huruf kecil"
in 'A'..'Z' -> "huruf besar"
in '0'..'9' -> "digit angka"
else -> "bukan alfanumerik"
}
println("Karakter '$karakter' -> $jenisHuruf")
}Output yang Dihasilkan:
Skor 75 -> Baik
Jam 23 -> Tengah Malam
Kode pos 55123 -> Yogyakarta
Karakter 'e' -> huruf kecilMari kita bedah setiap bagian:
in 90..100 -> "Sangat Baik": rentang90..100bersifat inklusif di kedua ujung. Karena75berada di rentang70..89, cabangBaikyang terpilih.in 6..10, in 11..14 -> ...: dua range dipisah koma. Subjek apa pun yang masuk salah satu rentang akan terpilih. Pola ini bermanfaat untuk mengelompokkan beberapa rentang yang berbagi aksi serupa.!in 10000..99999 -> "Bukan kode pos Indonesia": kebalikanin. Cabang ini cocok bila subjek tidak berada dalam rentang yang ditentukan. Pola ini berguna untuk validasi: kode pos di luar rentang Indonesia langsung diklasifikasikan terpisah.in 'a'..'z' -> "huruf kecil":CharRangejuga mendukung operatorin. Pencocokan karakter alfabet menjadi sangat ringkas.
Kombinasi Beberapa Range #
Operator in dapat muncul beberapa kali pada satu cabang yang dipisah koma. Hal ini memungkinkan kita menggabungkan rentang yang berdekatan atau bahkan berjauhan tanpa duplikasi cabang. Untuk jam = 23, cabang in 23..24, in 0..5 cocok karena 23 berada dalam rentang pertama.
Operator !in #
Operator !in adalah kebalikan dari in dan dapat muncul pada cabang manapun. Karena cabang dievaluasi berurutan, letak !in memengaruhi prioritas pencocokan. Umumnya !in ditempatkan terakhir agar cabang-cabang in yang spesifik lebih dahulu diuji.
Range yang Didukung #
| Tipe Range | Contoh | Penggunaan umum |
|---|---|---|
IntRange | 1..100 | skor, jam, kode pos |
CharRange | 'a'..'z' | klasifikasi karakter |
LongRange | 1L..1_000L | id besar, ukuran file |
IntProgression | 1..100 step 2 | angka ganjil/genap |
Referensi Lanjutan #
- Control flow
— bagian
whendengan kondisi range pada panduan resmi - Ranges
— panduan resmi range yang dipakai sebagai kondisi
when
Dengan kombinasi in dan !in, when dapat menggantikan banyak baris if (x >= a && x <= b). Pada chapter berikutnya kita akan menambahkan pencocokan berdasarkan tipe data menggunakan operator is, yang juga mengaktifkan fitur smart cast Kotlin.