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.

kotlin
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:

text
Skor 75 -> Baik
Jam 23 -> Tengah Malam
Kode pos 55123 -> Yogyakarta
Karakter 'e' -> huruf kecil

Mari kita bedah setiap bagian:

  1. in 90..100 -> "Sangat Baik": rentang 90..100 bersifat inklusif di kedua ujung. Karena 75 berada di rentang 70..89, cabang Baik yang terpilih.
  2. 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.
  3. !in 10000..99999 -> "Bukan kode pos Indonesia": kebalikan in. 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.
  4. in 'a'..'z' -> "huruf kecil": CharRange juga mendukung operator in. 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 RangeContohPenggunaan umum
IntRange1..100skor, jam, kode pos
CharRange'a'..'z'klasifikasi karakter
LongRange1L..1_000Lid besar, ukuran file
IntProgression1..100 step 2angka ganjil/genap

Referensi Lanjutan #

  • Control flow — bagian when dengan 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.