Untuk kasus yang melibatkan banyak kondisi berurutan, Kotlin menyediakan rantai else if yang dievaluasi dari atas ke bawah. Cabang pertama yang bernilai true akan dieksekusi, sementara cabang-cabang setelahnya dilewati. Sama seperti if biasa, rantai else if juga dapat berfungsi sebagai expression yang mengembalikan nilai. Hal ini menggantikan operator ternary ?: yang tidak ada di Kotlin. Pada chapter ini kita akan membandingkan bentuk statement dan expression pada rantai else if, serta melihat penerapannya pada kasus klasifikasi nilai dan perhitungan diskon.

Rantai else if sebagai Expression #

Rantai else if cocok untuk klasifikasi nilai numerik menjadi kategori diskrit. Kompilator mengevaluasi kondisi satu per satu mulai dari yang paling atas; ketika sebuah kondisi terpenuhi, nilai cabang tersebut dikembalikan dan cabang berikutnya tidak diperiksa lagi.

kotlin
fun main() {
    val nilai = 78

    // Rantai else-if untuk klasifikasi nilai ujian
    val predikat = if (nilai >= 90) {
        "A"
    } else if (nilai >= 80) {
        "B"
    } else if (nilai >= 70) {
        "C"
    } else if (nilai >= 60) {
        "D"
    } else {
        "E"
    }
    println("Nilai $nilai mendapat predikat $predikat")

    // Bentuk statement (tidak menghasilkan nilai)
    val jam = 14
    if (jam < 12) {
        println("Selamat pagi")
    } else if (jam < 15) {
        println("Selamat siang")
    } else if (jam < 18) {
        println("Selamat sore")
    } else {
        println("Selamat malam")
    }

    // Memilih diskon berdasarkan jumlah pembelian
    val totalBelanja = 250_000
    val diskon = if (totalBelanja >= 500_000) {
        0.20
    } else if (totalBelanja >= 200_000) {
        0.10
    } else if (totalBelanja >= 100_000) {
        0.05
    } else {
        0.0
    }
    val potongan = totalBelanja * diskon
    println("Diskon: ${(diskon * 100).toInt()}%, potongan Rp${potongan.toInt()}")
}

Output yang Dihasilkan:

text
Nilai 78 mendapat predikat C
Selamat siang
Diskon: 10%, potongan Rp25000

Mari kita bedah cara kerja contoh di atas:

  1. val predikat = if (nilai >= 90) "A" else if (...) ... else "E": kompilator memeriksa nilai >= 90 (false untuk 78), lalu nilai >= 80 (false), lalu nilai >= 70 (true), dan mengembalikan "C". Cabang >= 60 dan else tidak dievaluasi.
  2. Blok statement if (jam < 12) ... else ...: tidak ada variabel yang menerima hasil karena blok hanya memicu efek samping berupa println. Setiap cabang berhenti pada cabang yang cocok.
  3. val diskon = if (totalBelanja >= 500_000) 0.20 else if ...: karena 250_000 >= 200_000 adalah true, diskon menjadi 0.10. Tipe disimpulkan sebagai Double karena semua cabang mengembalikan Double.
  4. val potongan = totalBelanja * diskon: perkalian Int * Double menghasilkan Double. Konversi .toInt() dipakai untuk mencetak tanpa pecahan.

Tidak Ada Operator Ternary ?: #

Berbeda dengan Java, C, atau JavaScript, Kotlin tidak menyediakan operator ternary kondisi ? a : b. Operator if (kondisi) a else b menggantikan ternary sepenuhnya, sehingga pemrogram tidak perlu menghafal sintaks tambahan. Bentuk ini juga lebih mudah dibaca karena penanda cabangnya eksplisit.

Bentuk Statement vs Expression #

AspekBentuk StatementBentuk Expression
Mengembalikan nilai?TidakYa
Sintaksif (...) { ... } else if (...) { ... }val x = if (...) ... else if (...) ... else ...
Cocok untukaksi samping seperti printlnpemilihan nilai
Cabang else wajib?TidakYa untuk tipe non-Unit

Urutan Kondisi Penting #

Karena evaluasi berhenti pada cabang pertama yang true, urutan kondisi menentukan hasil akhir. Bila Anda menulis if (nilai >= 60) sebelum if (nilai >= 90), semua nilai di atas 60 akan masuk kategori pertama dan tidak pernah mencapai cabang yang lebih tinggi.

Referensi Lanjutan #

  • Control flow — bagian rantai else if pada panduan control flow resmi

Dengan pola else if, kita dapat menulis klasifikasi multi-kondisi yang ringkas dan tetap aman secara tipe. Pada chapter berikutnya kita akan bertemu when, konstruksi yang lebih cocok ketika jumlah cabang banyak atau ketika pencocokan dilakukan terhadap nilai spesifik.