Kotlin mengganti konstruksi switch dari bahasa turunan C dengan when yang lebih fleksibel dan ekspresif. Konstruksi when mencocokkan satu subjek terhadap serangkaian cabang, dan setiap cabang dapat memuat banyak nilai sekaligus. Sama seperti if, when dapat berfungsi sebagai statement atau expression yang menghasilkan nilai. Pada chapter ini kita akan membentuk when sederhana, when expression yang wajib menyertakan else, dan when tanpa argumen sebagai pengganti rantai else if.
Bentuk Statement: Pencocokan Sederhana #
Bentuk statement hanya mengeksekusi cabang yang cocok tanpa mengembalikan nilai. Sintaks when (subjek) { nilai -> aksi } mirip dengan switch case, tetapi tanpa perlu break karena cabang lain tidak ikut dieksekusi.
fun main() {
val hari = 3
// Bentuk statement: hanya mengeksekusi branch yang cocok
when (hari) {
1 -> println("Senin")
2 -> println("Selasa")
3 -> println("Rabu")
4 -> println("Kamis")
5 -> println("Jumat")
6, 7 -> println("Akhir pekan")
else -> println("Nomor hari tidak valid")
}
// Bentuk expression: wajib ada else, menghasilkan nilai
val kode = 404
val keterangan = when (kode) {
200 -> "OK"
301 -> "Moved Permanently"
404 -> "Not Found"
500 -> "Internal Server Error"
else -> "Kode tidak dikenal"
}
println("HTTP $kode -> $keterangan")
// Banyak nilai dalam satu branch dipisah koma
val bulan = 7
val musim = when (bulan) {
12, 1, 2 -> "Musim Hujan"
3, 4, 5 -> "Musim Pancaroba Awal"
6, 7, 8 -> "Musim Kemarau"
9, 10, 11 -> "Musim Pancaroba Akhir"
else -> "Bulan tidak valid"
}
println("Bulan $bulan -> $musim")
// when tanpa argumen: sebagai pengganti rantai if-else-if
val x = 15
when {
x < 0 -> println("$x negatif")
x == 0 -> println("$x nol")
x < 10 -> println("$x satu digit")
else -> println("$x dua digit")
}
}Output yang Dihasilkan:
Rabu
HTTP 404 -> Not Found
Bulan 7 -> Musim Kemarau
15 dua digitMari kita bedah setiap bagian penting pada contoh di atas:
when (hari) { 1 -> ...; 6, 7 -> ...; else -> ... }: subjekharidicocokkan terhadap setiap nilai. Untuk6, 7, kedua angka dipisah koma berbagi satu cabang.elsemenangani nilai di luar daftar.val keterangan = when (kode) { ... else -> "Kode tidak dikenal" }: sebagai expression, kompilator memerlukanelseagar semua nilai subjek tercakup dan tipe hasil menjadiString.when (bulan) { 12, 1, 2 -> "Musim Hujan" ... }: satu cabang dapat memuat banyak nilai, sangat berguna untuk pengelompokan musim berdasarkan bulan.when { x < 0 -> ...; else -> ... }: bentuk tanpa argumen. Setiap cabang berupa ekspresi boolean; cabang pertama yang true dieksekusi. Ini adalah alternatifelse ifyang lebih rapi.
Bentuk Expression Wajib else #
Ketika when digunakan sebagai expression yang mengembalikan nilai, kompilator mensyaratkan adanya else atau cabang yang menutup semua kemungkinan subjek. Tanpa else, kode gagal kompilasi untuk tipe terbuka seperti Int atau Any.
when Tanpa Argumen #
Bentuk when { ... } tanpa argumen adalah pengganti yang lebih bersih untuk rantai else if yang panjang. Setiap cabang berupa ekspresi boolean yang dievaluasi berurutan; cabang pertama yang true menentukan hasil.
| Pola | Cocok untuk |
|---|---|
when (x) { 1 -> ...; 2 -> ...; else -> ... } | pencocokan nilai spesifik |
when (x) { 1, 2, 3 -> ...; else -> ... } | pengelompokan banyak nilai |
when { kond1 -> ...; kond2 -> ...; else -> ... } | rantai kondisi heterogen |
Perbandingan dengan switch #
when menghilangkan beberapa kelemahan klasik switch di Java: tidak perlu break di setiap case, satu cabang dapat memuat banyak nilai, dan cabang dapat berupa ekspresi (mis. range atau type check) yang akan kita bahas pada chapter when-dengan-range dan when-dengan-type-checking.
Referensi Lanjutan #
- Control flow
— panduan resmi
whenexpression sebagai penggantiswitch
Setelah memahami dasar when, chapter berikutnya akan memperluas kemampuan pencocokan dengan range menggunakan operator in.