Higher Order Functions Kotlin

Muhammad Fajri
Sunday, 02 May 2021

Bismillahirrahmanirrahim.

Higher order functions merupakan function yang dioperasikan pada function lain, baik sebagai parameter maupun sebagai nilai return.

Berikut contoh higher order function sebagai parameter.

fun executor(action:() -> Unit) {
    action()
}

Perhatikan parameter pada function tersebut, action merupakan parameter dan tipe datanya ditulis sebagai () -> Unit yang menunjukkan bahwa tipe datanya adalah sebuah function. Dimana Unit merupakan tipe data sebagai nilai return, dengan kata lain tidak mengembalikan apa-apa. Dalam bahasa Kotlin, seperti bahasa yang lainnya, function dapat diteruskan atau mengembalikan nilai dari posisi manapun seperti variabel yang kita teruskan atau kembalikan nilainya.

Untuk membuat sebuah tipe data menjadi function–baik sebagai parameter maupun dalam deklarasi variabel, dimana function tersebut memiliki 3 komponen yaitu: (1) menempatkan daftar tipe data dari parameter ke dalam sebuah tanda kurung (kurung biasa), (2) operator arrow (tanda panah), dan (3) tipe data kembalian (return type).

Contoh berikut mendeklarasikan sebuah variabel dengan tipe data function.

val doThis:() -> Unit = {
    println("action")
}

Bagian kiri di atas (val doThis:() -> Unit) merupakan pendeklarasian sebuah variabel dengan tipe data function. Dan bagian kanan ({ println("action") }) terlihat seperti sebuah function tanpa header (kata kunci fun dan nama function), ini merupakan lambda.

Berikutnya, kita lihat kode lengkap dari kedua contoh baris program di atas.

val doThis:() -> Unit = {
    println("action")
}

fun executor(action:() -> Unit) {
    action()
    action.invoke()
}

fun main() {
    executor(doThis)
}

Output:

action
action

doThis dideklarasikan sebagai tipe data function. Implementasi function ini diberikan sebagai ekspresi lambda. Body dari function ini tidak mengembalikan nilai apa-apa, karenanya tipe data yang dikembalikan didefinisikan sebagai Unit.

executor() merupakan function yang menerima function yang lain sebagai sebuah parameter, parameternya diberi nama action dan bertipe data function yang dituliskan sebagai () -> Unit. Lebih spesifik lagi, function ini tidak mengembalikan nilai apa-apa, makanya dideklarasikan sebagai Unit.

Dengan menambahkan tanda kurung () pada nama parameter (action()), kita bermaksud memanggil function tersebut. Cara lain memanggil function action yaitu action.invoke(), tetapi memanggil function dengan action() lebih idiomatik dan lebih disarankan.

Di dalam main function kita memanggil function executor() dengan meneruskan doThis. doThis diteruskan tanpa menggunakan tanda kurung. Ini dimaksudkan bahwa kita ingin meneruskan doThis sebagai sebuah function, bukan sebagai nilai hasil.

Dari contoh program di atas ini, kita menuliskan doThis sebagai atribut atau properti dimana nilainya adalah sebuah lambda. Cara ini sangatlah bagus, tetapi mungkin tidak terlihat alami sebagaimana cara penulisan sebuah function. Cara lain untuk menuliskan contoh program tersebut adalah sebagai berikut.

fun doThis() {
    println("action")
}

fun executor(action:() -> Unit) {
    action()
}

fun main() {
    executor(::doThis)
}

Sekarang doThis didefinisikan sebagaimana cara penulisan sebuah function, dengan kata kunci fun dan sebuah nama pada bagian header.

::doThis dipanggil dengan dua buah tanda titik dua. Ini artinya kita menyelesaikan function yang berada dalam package saat ini.

Referensi

  1. Hagos, Ted. 2018. Learn Android Studio 3 with Kotlin: Efficient Android App Development. Apress: Manila.