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.

kotlin
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:

text
10 + 20 = 30
50 - 18 = 32
Bilangan positif: [3, 7, 5]
Bilangan genap: [-2, -8, 0]

Mari kita bedah baris per baris:

  1. op: (Int, Int) -> Int: parameter op bertipe function yang menerima dua Int dan mengembalikan Int. Tanda panah -> memisahkan daftar parameter dengan tipe kembalian.
  2. predikat: (Int) -> Boolean: parameter predikat bertipe function yang menerima Int dan mengembalikan Boolean. Cocok untuk filter atau validasi.
  3. jalankan({ x, y -> x + y }, 10, 20): lambda { x, y -> x + y } diberikan sebagai argumen pertama. Lambda memiliki tipe (Int, Int) -> Int secara implisit dari konteks.
  4. 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.

TipeArtiContoh Pemanggilan
() -> Unitfunction tanpa parameter, tanpa return value() -> println("halo")
(Int) -> Intmenerima satu Int, mengembalikan Int{ x -> x * 2 }
(Int, Int) -> Intmenerima dua Int, mengembalikan Int{ x, y -> x + y }
(String) -> Booleanmenerima String, mengembalikan Boolean{ s -> s.isNotEmpty() }
() -> () -> Intfunction yang mengembalikan function{ -> { -> 42 } }
suspend (Int) -> Stringsuspend function menerima Int, mengembalikan Stringsuspend lambda
Int.(Int) -> Intreceiver 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.

kotlin Contoh: tipe suspend function (ilustratif)
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).

kotlin Contoh: tipe function dengan receiver
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 #

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 ::.