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.
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:
Nilai maksimum: 25
Cabang b terpilih
Status: b lebih besar atau sama
a adalah genap
Demam, selisih 1 derajat di atas ambangMari kita bedah baris-baris penting pada contoh di atas:
val maksimum = if (a > b) a else b: kompilator mengevaluasi kondisia > b, lalu mengembalikanaataub. Hasilnya diikat ke variabelval, sehinggamaksimumbersifat read-only.val status = if (...) { ... } else { ... }: ketika cabang ditulis sebagai blok, baris terakhir pada blok menjadi nilai yang dikembalikan. Pernyataanprintlndi baris-baris sebelumnya dieksekusi untuk efek sampingnya, tetapi tidak ikut dikembalikan.val hasil: Any = if (a % 2 == 0) "genap" else "ganjil": anotasi tipe eksplisitAnydi sini hanya untuk dokumentasi; kompilator sebenarnya sudah menyimpulkan tipe gabunganString.val suhu = 38; val pesan = ...: variabel lokalselisihdi dalam blokifhanya hidup selama blok tersebut dievaluasi, lalu nilai string terakhir dikembalikan kepesan.
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 #
| Aspek | Statement if | Expression if |
|---|---|---|
| Menghasilkan nilai? | Tidak | Ya |
| Variabel perlu deklarasi awal? | Ya, var lalu diisi | Tidak, val langsung diikat |
| Cocok untuk | efek samping banyak | pemilihan nilai |
Cabang else wajib? | Tidak | Ya bila nilai ingin non-Unit |
Referensi Lanjutan #
- Control flow
— bagian
ifsebagai 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.