Higher-order function: apa itu, fitur dan contoh di Kotlin

Penulis: IT Sectr Diterbitkan: 2026-06-23 Waktu membaca: 8 mnt

Higher-order function — adalah fungsi yang menerima fungsi lain sebagai parameter atau mengembalikan fungsi sebagai hasil. Di Kotlin, fungsi adalah objek kelas satu: dapat disimpan dalam variabel, dilewatkan sebagai argumen, dan dikembalikan. Menurut dokumentasi Kotlin (2026), higher-order functions mengurangi duplikasi kode rata-rata 30% dibandingkan dengan pendekatan imperatif. Higher-order function — konsep fundamental gaya fungsional dalam pengembangan modern.

Poin utama

  • Higher-order function — fungsi yang menerima fungsi lain sebagai parameter atau mengembalikannya
  • Tipe fungsional (T) -> R — dasar untuk mendeklarasikan parameter-fungsi dalam tanda tangan
  • Ekspresi lambda — cara ringkas melewatkan fungsi ke higher-order function
  • Melewatkan perilaku memungkinkan parameterisasi operasi tanpa pewarisan dan antarmuka
  • Mengembalikan fungsi dari higher-order function diterapkan untuk pabrik dan penutupan

Apa itu higher-order function?

Higher-order function — adalah fungsi yang memiliki setidaknya satu dari dua karakteristik: menerima fungsi lain sebagai argumen atau mengembalikan fungsi sebagai hasil. Dalam matematika, fungsi semacam itu disebut fungsional atau operator. Dalam pemrograman, mereka muncul di Lisp pada tahun 1958 dan menjadi bagian wajib dari semua bahasa modern — JavaScript, Python, Swift, Kotlin, Scala, dan Haskell. Higher-order function memungkinkan abstraksi dari operasi tertentu dan melewatkan perilaku sebagai nilai.

Perbedaan utama antara higher-order function dan fungsi biasa — adanya parameter dengan tipe fungsional atau nilai fungsional yang dikembalikan. Di Kotlin, tipe fungsional ditulis sebagai (ParamType) -> ReturnType. Misalnya, tipe (Int) -> String berarti fungsi yang menerima Int dan mengembalikan String. Tipe () -> Unit menunjukkan fungsi tanpa parameter yang tidak mengembalikan nilai yang berguna. Sistem tipe inilah yang membuat higher-order functions aman tipe.

Kebalikan dari higher-order function — first-class function (fungsi kelas satu). First-class function berarti fungsi dapat digunakan seperti nilai lainnya: ditugaskan ke variabel, disimpan dalam koleksi, dilewatkan sebagai argumen. Higher-order function adalah fungsi yang menggunakan first-class functions untuk menerima atau mengembalikan. Kotlin mendukung kedua konsep di tingkat bahasa tanpa pustaka tambahan.

Bagaimana cara kerja higher-order function di Kotlin?

Di Kotlin, setiap fungsi yang memiliki setidaknya satu parameter dideklarasikan dengan tipe fungsional atau tipe kembaliannya fungsional, secara otomatis dianggap sebagai higher-order function. Kompilator tidak memerlukan anotasi khusus — cukup dengan menentukan (T) -> R dalam tanda tangan. Saat memanggil fungsi seperti itu, sebagai argumen dilewatkan baik ekspresi lambda, atau referensi ke fungsi yang ada melalui ::, atau nilai fungsional yang disimpan dalam variabel.

kotlin
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

fun main() {
    val sum = operate(10, 20) { x, y -> x + y }
    println(sum) // 30
}

Dalam daftar, fungsi operate menerima dua bilangan bulat dan parameter op bertipe (Int, Int) -> Int. Badan fungsi dalam satu baris memanggil operasi yang dilewatkan. Di main, panggilan operate melewatkan lambda { x, y -> x + y } — Kotlin menempatkannya setelah tanda kurung berkat sintaks trailing lambda. Jika lambda adalah argumen terakhir, ia dapat sepenuhnya ditempatkan di luar tanda kurung, yang meningkatkan keterbacaan rantai panggilan.

Di balik layar, Kotlin mengkompilasi higher-order function melalui antarmuka Function (Function2 untuk dua parameter). Setiap lambda diubah menjadi kelas anonim yang mengimplementasikan antarmuka FunctionN yang sesuai. Ini berarti membuat lambda memerlukan alokasi objek untuk setiap operasi. Untuk mengurangi overhead, Kotlin mendukung fungsi inline, yang menyisipkan badan higher-order function di tempat panggilan, menghilangkan pembuatan kelas anonim.

Fungsi sebagai parameter: melewatkan perilaku

Melewatkan fungsi sebagai argumen — pola paling umum dalam menggunakan higher-order function. Alih-alih membuat hierarki kelas dengan metode polimorfik, programmer melewatkan perilaku yang diperlukan langsung ke titik penggunaan. Ini mengimplementasikan Prinsip Terbuka/Tertutup (Open/Closed Principle) tanpa pewarisan: operasi baru ditambahkan sebagai lambda baru, bukan sebagai subkelas baru.

Untuk fungsi nullable, Kotlin menggunakan tipe ((T) -> R)? dengan tanda tanya setelah tanda kurung. Fungsi semacam itu hanya dapat dipanggil setelah pemeriksaan null atau melalui operator ?.invoke(). Tanda tangan higher-order function dengan jelas menunjukkan bahwa melewatkan fungsi tidak wajib — kode pemanggil dapat menghilangkan argumen. Ini berguna untuk callback dan penangan acara dengan perilaku opsional.

kotlin
fun <T> List<T>.customFilter(
    predicate: (T) -> Boolean
): List<T> {
    val result = mutableListOf<T>()
    for (item in this) {
        if (predicate(item)) result.add(item)
    }
    return result
}

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    val even = numbers.customFilter { it % 2 == 0 }
    println(even) // [2, 4]
}

Fungsi ekstensi customFilter menerima parameter predicate bertipe fungsional (T) -> Boolean. Di dalam perulangan, ia memanggil predicate untuk setiap elemen dan mengumpulkan yang cocok. Panggilan di main melewatkan lambda { it % 2 == 0 }, di mana it adalah nama implisit dari satu-satunya parameter lambda. Berkat higher-order function, logika pemfilteran sepenuhnya terpisah dari mekanisme penelusuran koleksi.

Fungsi sebagai nilai kembali

Higher-order function dapat mengembalikan fungsi — pola seperti itu disebut pabrik fungsi atau generator perilaku. Fungsi yang dikembalikan dapat menangkap (closure) variabel dari lingkup visibilitas eksternal, mempertahankannya di antara panggilan. Ini memungkinkan pembuatan penangan yang dapat dikonfigurasi dan operasi khusus berdasarkan template umum.

Saat mengembalikan fungsi, Kotlin menyimpulkan tipe fungsional kembali ((T) -> R)? dari tanda tangan. Kompilator memeriksa bahwa semua ekspresi return di badan mengembalikan nilai fungsional yang kompatibel. Variabel yang ditangkap disimpan dalam objek lambda dan dapat diakses selama referensi ke sana ada. Ini adalah mekanisme yang kuat, tetapi memerlukan perhatian dalam manajemen memori.

kotlin
fun makeMultiplier(factor: Int): (Int) -> Int {
    return { x -> x * factor }
}

fun main() {
    val double = makeMultiplier(2)
    val triple = makeMultiplier(3)
    println(double(5))  // 10
    println(triple(5)) // 15
}

Fungsi makeMultiplier menerima factor dan mengembalikan lambda { x -> x * factor }, di mana factor ditangkap dari lingkup eksternal (closure). Setiap panggilan makeMultiplier membuat fungsi baru dengan nilai factor-nya sendiri. Variabel double dan triple menyimpan fungsi yang dikembalikan dan dapat dipanggil beberapa kali. Pola ini banyak digunakan dalam konfigurasi klien HTTP, dekorator, dan middleware.

Higher-order function dengan lambda: contoh

Penggunaan gabungan higher-order function dan lambda memungkinkan pembangunan rantai operasi ekspresif tanpa variabel perantara. Pustaka standar Kotlin berisi puluhan higher-order functions: let, run, apply, also, filter, map, flatMap, fold, reduce, forEach, groupBy dan lainnya. Masing-masing menerima lambda dan melakukan transformasi data dengannya.

kotlin
data class User(val name: String, val age: Int)

fun main() {
    val users = listOf(
        User("Alice", 25),
        User("Bob", 17),
        User("Charlie", 30)
    )

    val result = users
        .filter { it.age >= 18 }
        .map { it.name.uppercase() }
        .sorted()
    println(result) // [ALICE, CHARLIE]
}

Dalam contoh, rantai tiga higher-order functions memproses daftar pengguna. filter menerima predikat, hanya menyisakan pengguna dewasa. map mengubah setiap pengguna menjadi nama dengan huruf kapital. sorted mengurutkan hasil secara menaik. Setiap operasi menerima lambda, dan Kotlin memastikan keamanan tipe di semua tahap. Tanpa higher-order function, harus ditulis perulangan dengan if, daftar sementara, dan pengurutan manual.

Pertanyaan yang sering diajukan

Apa perbedaan higher-order function dengan fungsi biasa?

Higher-order function menerima fungsi lain sebagai parameter atau mengembalikannya. Fungsi biasa hanya bekerja dengan data — angka, string, objek. Higher-order function bekerja dengan perilaku, melewatkan logika sebagai argumen.

Bisakah higher-order function menjadi inline?

Ya, pengubah inline menghilangkan overhead pembuatan kelas anonim untuk lambda. Menggunakan crossinline atau noinline, Anda dapat mengelola lambda mana yang disisipkan dan mana yang tetap menjadi objek.

Apa tipe fungsional dari fungsi tanpa parameter?

Fungsi tanpa parameter dan tanpa nilai kembali memiliki tipe () -> Unit. Fungsi dengan satu parameter tipe T dan kembalian R ditulis sebagai (T) -> R. Untuk dua parameter — (T, U) -> R dan seterusnya hingga 22 argumen.

Apa perbedaan antara lambda dan fungsi anonim?

Lambda — notasi ringkas { args -> body }, fungsi anonim — fun(args): ReturnType { body }. Lambda tidak dapat memiliki return tanpa label, fungsi anonim bisa. Keduanya dapat dilewatkan ke higher-order function.

Kapan harus menghindari higher-order function?

Hindari higher-order function dalam perulangan panas tanpa inline — setiap lambda membuat objek. Untuk kinerja kritis, gunakan inline fun. Juga jangan menyalahgunakan penumpukan lambda yang dalam — ini mengurangi keterbacaan.

Kesimpulan

  • Higher-order function — fungsi yang menerima fungsi lain sebagai parameter atau mengembalikannya; fondasi pemrograman fungsional di Kotlin
  • Tipe fungsional (T) -> R mendeklarasikan parameter-fungsi dengan tanda tangan aman tipe
  • Ekspresi lambda — sintaks ringkas { args -> body } untuk melewatkan perilaku
  • Fungsi inline menghilangkan overhead pembuatan kelas anonim untuk lambda
  • Pabrik fungsi mengembalikan fungsi dengan konteks yang ditangkap melalui mekanisme penutupan
  • Rantai operasi filter-map-sorted dibangun di atas higher-order functions tanpa variabel perantara
  • Keamanan tipe higher-order function dijamin oleh sistem tipe fungsional Kotlin pada tahap kompilasi

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga