Banyak function sederhana hanya berisi satu ekspresi yang mengembalikan hasil. Menulis kurung kurawal dan keyword return untuk kasus seperti ini terasa berlebihan. Kotlin menyediakan bentuk single-expression function yang memungkinkan kita menulis fun nama(params) = ekspresi secara langsung. Pada chapter ini kita akan melihat kapan bentuk ini cocok dipakai dan apa yang terjadi pada tipe kembalian.

Sintaks Dasar #

Sebuah single-expression function menggantikan pasangan : Tipe { return ... } dengan tanda sama dengan yang diikuti ekspresi. Tipe kembalian boleh ditulis eksplisit atau dihilangkan; bila dihilangkan, kompilator menyimpulkan dari tipe ekspresi di sisi kanan.

kotlin
fun kuadrat(x: Int) = x * x

fun sapa(nama: String) = "Halo, $nama!"

fun isGenap(n: Int): Boolean = n % 2 == 0

fun main() {
    println("Kuadrat 9 = ${kuadrat(9)}")
    println(sapa("Budi"))
    println("Apakah 8 genap? ${isGenap(8)}")
    println("Apakah 7 genap? ${isGenap(7)}")
}

Output yang Dihasilkan:

text
Kuadrat 9 = 81
Halo, Budi!
Apakah 8 genap? true
Apakah 7 genap? false

Mari kita bedah baris per baris:

  1. fun kuadrat(x: Int) = x * x: tanda = menggantikan kurung kurawal dan return. Tipe kembalian tidak ditulis; kompilator menyimpulkan Int dari hasil x * x yang bertipe Int.
  2. fun sapa(nama: String) = "Halo, $nama!": ekspresi string template mengembalikan String, sehingga tipe kembalian String disimpulkan otomatis.
  3. fun isGenap(n: Int): Boolean = n % 2 == 0: tipe kembalian Boolean ditulis eksplisit meskipun sebenarnya dapat disimpulkan. Penulisan eksplisit kadang dipakai untuk menegaskan kontrak function.
  4. println("Kuadrat 9 = ${kuadrat(9)}"): pemanggilan kuadrat(9) mengembalikan 81 yang langsung disisipkan ke string template.

Kapan Menggunakan Single-Expression #

Bentuk ini cocok untuk function yang body-nya betul-betul hanya satu ekspresi. Kandidat ideal meliputi:

  • function matematika sederhana seperti luas(r) = PI * r * r
  • function yang mengembalikan hasil ekspresi boolean seperti valid(x) = x > 0
  • function yang membungkus pemanggilan lain dengan sedikit transformasi
  • function yang mengembalikan string format ringkas

Sebaliknya, bila body memerlukan beberapa pernyataan, perulangan, atau cabang kompleks, gunakan bentuk biasa dengan kurung kurawal. Memaksakan bentuk single-expression dengan operator Elvis berlapis atau when bersarang sering menurunkan keterbacaan.

kotlin Contoh: pemakaian yang tepat dan yang berlebihan
// Tepat: ekspresi tunggal yang jelas
fun diameter(r: Double) = 2 * r

// Tepat: ekspresi boolean sederhana
fun dewasa(umur: Int) = umur >= 17

// Berlebihan: when bersarang lebih baik ditulis biasa
fun kategori(n: Int) = when {
    n < 0 -> "negatif"
    n == 0 -> "nol"
    n < 10 -> "kecil"
    else -> "besar"
}

kategori di atas masih sah sebagai single-expression, tetapi bila logikanya bertambah panjang, pindahkan ke bentuk fun kategori(n: Int): String { ... } biasa.

Type Inference dan Batasannya #

Kompilator menyimpulkan tipe kembalian dari ekspresi di sisi kanan tanda =. Inferensi ini bekerja untuk tipe primitif, String, Pair, List, dan tipe lain yang dapat ditentukan tanpa ambiguitas. Namun, bila ekspresi mengandung panggilan ke function generik yang tipe parameternya tidak dapat ditentukan, kita wajib menuliskan tipe kembalian secara eksplisit.

kotlin Contoh: kasus di mana tipe eksplisit lebih aman
fun daftarKosong() = emptyList<Int>()   // tipe disimpulkan List<Int>
fun daftarGenerik() = listOf(1, 2, 3)   // tipe disimpulkan List<Int>

Pada kasus di atas, kompilator berhasil menyimpulkan karena tipe elemen tersirat dari argumen emptyList<Int>() atau listOf(1, 2, 3). Bila tipe tidak dapat ditentukan, kompilator melaporkan galat dan meminta kita menuliskan tipe eksplisit.

Perbandingan dengan Bentuk Biasa #

Tabel berikut merangkum perbedaan sintaks antara bentuk biasa dan single-expression.

AspekBentuk BiasaSingle-Expression
Pembuka body{=
Keyword returnWajib untuk tipe non-UnitTidak ditulis
Tipe kembalianWajib untuk non-UnitBoleh dihilangkan
Banyak pernyataanBebasHanya satu ekspresi
Contohfun f(x: Int): Int { return x*2 }fun f(x: Int) = x * 2

Referensi Lanjutan #

  • Kotlin functions — panduan resmi single-expression function dengan sintaks fun name() = expr

Ringkasan #

Single-expression function memendekkan deklarasi function sederhana menjadi satu baris dengan tanda =. Tipe kembalian dapat dihilangkan bila dapat disimpulkan. Bentuk ini paling tepat untuk function ringkas yang body-nya memang hanya satu ekspresi. Pada chapter Default Arguments berikutnya, kita akan melihat bagaimana memberikan nilai bawaan pada parameter sehingga pemanggil boleh menghilangkan sebagian argumen.