Function di Kotlin memiliki tipe seperti halnya Int atau String. Tipe ini dapat dituliskan secara eksplisit pada deklarasi variabel, parameter, atau return type. Memahami sintaks tipe function membantu kita membaca deklarasi higher-order function dengan tepat. Pada chapter ini kita akan membahas tiga varian tipe function: biasa, dengan suspend, dan dengan receiver.
Sintaks Dasar (A, B) -> C #
Tipe function ditulis dengan daftar tipe parameter dalam tanda kurung, tanda panah ->, lalu tipe kembalian. Function tanpa parameter menulis tanda kurung kosong (). Function tanpa return value menulis Unit.
fun jalankan(op: (Int, Int) -> Int, a: Int, b: Int): Int = op(a, b)
fun filterData(daftar: List<Int>, predikat: (Int) -> Boolean): List<Int> {
val hasil = mutableListOf<Int>()
for (n in daftar) {
if (predikat(n)) hasil.add(n)
}
return hasil
}
fun main() {
val jumlah = jalankan({ x, y -> x + y }, 10, 20)
println("10 + 20 = $jumlah")
val selisih = jalankan({ x, y -> x - y }, 50, 18)
println("50 - 18 = $selisih")
val data = listOf(3, -2, 7, -1, 5, -8, 0)
val positif = filterData(data) { n -> n > 0 }
println("Bilangan positif: $positif")
val genap = filterData(data) { n -> n % 2 == 0 }
println("Bilangan genap: $genap")
}Output yang Dihasilkan:
10 + 20 = 30
50 - 18 = 32
Bilangan positif: [3, 7, 5]
Bilangan genap: [-2, -8, 0]Mari kita bedah baris per baris:
op: (Int, Int) -> Int: parameteropbertipe function yang menerima duaIntdan mengembalikanInt. Tanda panah->memisahkan daftar parameter dengan tipe kembalian.predikat: (Int) -> Boolean: parameterpredikatbertipe function yang menerimaIntdan mengembalikanBoolean. Cocok untuk filter atau validasi.jalankan({ x, y -> x + y }, 10, 20): lambda{ x, y -> x + y }diberikan sebagai argumen pertama. Lambda memiliki tipe(Int, Int) -> Intsecara implisit dari konteks.filterData(data) { n -> n > 0 }: lambda diletakkan di luar tanda kurung — pola trailing lambda. Bila parameter terakhir sebuah function adalah tipe function, lambda dapat ditulis setelah tanda kurung tutup.
Bentuk Umum Tipe Function #
Tabel berikut merangkum variasi tipe function yang sering dijumpai.
| Tipe | Arti | Contoh Pemanggilan |
|---|---|---|
() -> Unit | function tanpa parameter, tanpa return value | () -> println("halo") |
(Int) -> Int | menerima satu Int, mengembalikan Int | { x -> x * 2 } |
(Int, Int) -> Int | menerima dua Int, mengembalikan Int | { x, y -> x + y } |
(String) -> Boolean | menerima String, mengembalikan Boolean | { s -> s.isNotEmpty() } |
() -> () -> Int | function yang mengembalikan function | { -> { -> 42 } } |
suspend (Int) -> String | suspend function menerima Int, mengembalikan String | suspend lambda |
Int.(Int) -> Int | receiver Int, parameter Int, return Int | { other -> this + other } |
suspend Function Type #
Pada kode yang memakai coroutines, kita sering menjumpai tipe function dengan modifier suspend. Modifier ini menandai bahwa function (atau lambda) dapat menjeda dan melanjutkan eksekusi tanpa memblokir thread. Tipe suspend (Int) -> String berarti function menerima Int, mengembalikan String, dan dapat dijalankan di dalam coroutine context.
import kotlin.coroutines.*
suspend fun ambilData(id: Int): String {
// misal: menunggu network
return "data-$id"
}
fun main() = runBlocking {
val operasi: suspend (Int) -> String = ::ambilData
println(operasi(42))
}Detail suspend function dan coroutine akan kita bedah tuntas pada section Coroutines. Untuk sekarang, cukup pahami bahwa suspend adalah bagian dari tipe function — sebuah function biasa tidak dapat diberikan ke parameter bertipe suspend (...) -> ....
Receiver Type A.(B) -> C #
Tipe function dengan receiver menambahkan tipe penerima sebelum tanda kurung. Bentuk Int.(Int) -> Int berarti function yang dipanggil pada instance Int, menerima satu Int, dan mengembalikan Int. Di dalam body, this merujuk ke instance penerima. Receiver type adalah dasar dari lambda dengan receiver yang dipakai pada scope functions (let, run, apply, also).
fun Int.tambah(other: Int): Int = this + other
fun main() {
val op: Int.(Int) -> Int = { other -> this + other }
println(5.op(3)) // 8
println(5.tambah(3)) // 8 — member function juga cocok dengan tipe receiver
}Lambda dengan receiver { other -> this + other } dapat dipanggil dengan bentuk 5.op(3) — 5 menjadi this dan 3 menjadi other. Tipe receiver sering dipakai untuk membangun DSL Kotlin seperti yang dipakai Gradle Kotlin DSL atau Anko.
Referensi Lanjutan #
- Kotlin higher-order functions and lambdas
— panduan resmi function type seperti
(A, B) -> Rdansuspend () -> T - Kotlin functions — rujukan function declaration sebagai konteks tipe function
Ringkasan #
Tipe function ditulis (A, B) -> C dengan tanda panah memisahkan parameter dan return type. Modifier suspend menandai function yang dapat berjalan di coroutine context. Receiver type A.(B) -> C menambahkan tipe penerima sehingga function dapat dipanggil dengan sintaks a.op(b). Pada chapter Function References berikutnya, kita akan melihat cara meneruskan function yang sudah dideklarasikan sebagai nilai dengan operator ::.