Dalam kebanyakan bahasa pemrograman, if hanya berfungsi sebagai cabang eksekusi tanpa menghasilkan nilai. Kotlin memperlakukan if sebagai expression, sehingga konstruksi if (kondisi) a else b benar-benar mengembalikan nilai yang dapat diikat ke variabel. Sifat ini membuat banyak pola penugasan bersyarat menjadi lebih ringkas tanpa perlu variabel sementara yang bermutasi. Pada chapter ini kita akan membahas bentuk dasar if expression, bentuk blok multi-baris, dan konsekuensi ketika cabang else tidak ditulis.

Bentuk Sederhana if Expression #

Bentuk paling ringkas dari if expression adalah val x = if (kondisi) a else b. Kompilator mengevaluasi kondisi terlebih dahulu, kemudian mengembalikan nilai dari cabang yang dipilih. Karena if menghasilkan nilai, kita tidak perlu mendeklarasikan variabel kosong lalu mengisinya pada setiap cabang.

kotlin
fun main() {
    val a = 10
    val b = 25

    // Bentuk expression: if langsung menghasilkan nilai
    val maksimum = if (a > b) a else b
    println("Nilai maksimum: $maksimum")

    // Bentuk block: baris terakhir di setiap branch menjadi nilai
    val status = if (a > b) {
        println("Cabang a terpilih")
        "a lebih besar"
    } else {
        println("Cabang b terpilih")
        "b lebih besar atau sama"
    }
    println("Status: $status")

    // if expression tanpa else hanya menghasilkan Unit bila cabang false tidak ada
    val hasil: Any = if (a % 2 == 0) "genap" else "ganjil"
    println("a adalah $hasil")

    val suhu = 38
    val pesan = if (suhu >= 37) {
        val selisih = suhu - 37
        "Demam, selisih $selisih derajat di atas ambang"
    } else {
        "Suhu normal"
    }
    println(pesan)
}

Output yang Dihasilkan:

text
Nilai maksimum: 25
Cabang b terpilih
Status: b lebih besar atau sama
a adalah genap
Demam, selisih 1 derajat di atas ambang

Mari kita bedah baris-baris penting pada contoh di atas:

  1. val maksimum = if (a > b) a else b: kompilator mengevaluasi kondisi a > b, lalu mengembalikan a atau b. Hasilnya diikat ke variabel val, sehingga maksimum bersifat read-only.
  2. val status = if (...) { ... } else { ... }: ketika cabang ditulis sebagai blok, baris terakhir pada blok menjadi nilai yang dikembalikan. Pernyataan println di baris-baris sebelumnya dieksekusi untuk efek sampingnya, tetapi tidak ikut dikembalikan.
  3. val hasil: Any = if (a % 2 == 0) "genap" else "ganjil": anotasi tipe eksplisit Any di sini hanya untuk dokumentasi; kompilator sebenarnya sudah menyimpulkan tipe gabungan String.
  4. val suhu = 38; val pesan = ...: variabel lokal selisih di dalam blok if hanya hidup selama blok tersebut dievaluasi, lalu nilai string terakhir dikembalikan ke pesan.

Bentuk Blok Multi-Baris #

Bentuk blok berguna ketika cabang perlu melakukan kerja tambahan sebelum menghasilkan nilai. Aturan utamanya: baris terakhir yang tidak diawali keyword kontrol menjadi nilai kembalian. Jika baris terakhir adalah println(...) yang mengembalikan Unit, maka seluruh cabang mengembalikan Unit.

Tanpa else: Mengembalikan Unit #

Ketika if digunakan sebagai expression tanpa cabang else, kompilator menyimpulkan tipe hasil sebagai Any? atau Unit karena cabang yang tidak terpenuhi tidak mengembalikan apa pun. Untuk menghindari kejutan ini, selalu sertakan cabang else ketika Anda memerlukan nilai yang dapat diandalkan.

Perbandingan Bentuk Statement vs Expression #

AspekStatement ifExpression if
Menghasilkan nilai?TidakYa
Variabel perlu deklarasi awal?Ya, var lalu diisiTidak, val langsung diikat
Cocok untukefek samping banyakpemilihan nilai
Cabang else wajib?TidakYa bila nilai ingin non-Unit

Referensi Lanjutan #

  • Control flow — bagian if sebagai expression pada panduan control flow resmi

Penggunaan if sebagai expression mengurangi boilerplate dan memperjelas niat: pembaca langsung tahu bahwa blok if bertujuan memilih nilai, bukan sekadar menjalankan aksi. Pada chapter berikutnya kita akan membentuk rantai else if untuk kasus klasifikasi multi-kondisi.