Lambda: apa itu, sintaksis dan penggunaan di Kotlin

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

Lambda — adalah fungsi anonim yang disajikan dalam bentuk ekspresi ringkas { argumen -> tubuh }. Di Kotlin, lambda adalah cara utama untuk meneruskan perilaku ke fungsi tingkat tinggi (higher-order functions), memberikan sintaksis yang ringkas tanpa perlu mendeklarasikan fungsi terpisah. Menurut dokumentasi Kotlin (2026), lebih dari 70% fungsi tingkat tinggi dalam proyek tipikal dipanggil dengan lambda. Lambda memungkinkan penulisan kode dalam gaya fungsional dengan noise sintaksis yang minimal.

Poin utama

  • Lambda — fungsi anonim dalam sintaksis { args -> body }, tanpa nama
  • Nama implisit it menggantikan satu-satunya argumen lambda, menyederhanakan penulisan
  • Trailing lambda — menempatkan lambda terakhir di luar tanda kurung panggilan untuk keterbacaan
  • Penangkapan (closure) — lambda dapat mengakses variabel dari ruang lingkup eksternal
  • Tipe fungsional (T) -> R menentukan tanda tangan lambda dan diperiksa oleh kompiler

Apa itu lambda?

Lambda (ekspresi lambda) — adalah fungsi anonim yang didefinisikan sebagai ekspresi, bukan deklarasi. Istilah ini berasal dari kalkulus lambda Alonzo Church (1936). Dalam pemrograman, lambda mewakili blok kode yang dapat diteruskan sebagai nilai, disimpan dalam variabel, dan dipanggil nanti. Di Kotlin, lambda selalu diapit oleh kurung kurawal { }, argumen dipisahkan dari tubuh oleh panah ->.

Lambda berbeda dari fungsi biasa dengan tidak adanya nama dan kata kunci fun. Hal ini memungkinkan deklarasi perilaku langsung di titik penggunaan, tanpa mengotori kode dengan deklarasi tambahan. Kompiler Kotlin menyimpulkan tipe argumen dari konteks, sehingga dalam banyak kasus tipe dapat dihilangkan. Lambda adalah gula sintaksis di atas tipe fungsional (T) -> R: setiap lambda memiliki tipe fungsional yang sesuai.

Penggunaan utama lambda di Kotlin adalah penerusan ke fungsi tingkat tinggi (higher-order functions). Pustaka standar menggunakan lambda di mana-mana: filter { it > 0 }, map { it.uppercase() }, forEach { println(it) }. Lambda juga digunakan untuk membuat pendengar peristiwa, callback, konfigurator objek melalui apply dan run, yang membuat kode lebih deklaratif dibandingkan dengan kelas anonim.

Sintaksis ekspresi lambda di Kotlin

Bentuk lengkap ekspresi lambda di Kotlin: { argumen -> tubuh_lambda }. Argumen didaftar dengan koma, diikuti oleh panah dan tubuh — satu atau lebih ekspresi. Jika tubuh berisi beberapa baris, ekspresi terakhir menjadi nilai yang dikembalikan. Jika fungsi menerima lambda sebagai argumen terakhir, lambda dapat ditempatkan di luar tanda kurung panggilan.

kotlin
val sum: (Int, Int) -> Int = { a, b -> a + b }

// Tipe yang disimpulkan dari konteks
val sumShort = { a: Int, b: Int -> a + b }

// Panggilan lambda
val result = sum(5, 3)  // 8
println(result)

Variabel sum dideklarasikan dengan tipe fungsional eksplisit (Int, Int) -> Int dan diinisialisasi dengan lambda { a, b -> a + b }. Untuk sumShort, tipe ditentukan di dalam lambda dan tipe variabel disimpulkan. Kedua varian setara. Memanggil lambda tidak berbeda dengan memanggil fungsi biasa — menggunakan sintaksis sum(5, 3). Lambda tanpa argumen ditulis sebagai { body }, dengan satu argumen — { it -> it * 2 } atau cukup { it * 2 }.

Nama implisit it dan menghilangkan argumen

Ketika lambda menerima tepat satu argumen, Kotlin menyediakan nama implisit it. Ini menghilangkan kebutuhan untuk mendeklarasikan argumen di sisi kiri. Programmer hanya menulis tubuh lambda, menggunakan it untuk mengakses satu-satunya parameter. Sintaksis seperti ini sangat nyaman dalam rantai pemrosesan koleksi, di mana it menunjukkan elemen saat ini.

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

// Nama parameter eksplisit
val squaredExplicit = numbers.map { n -> n * n }

// it implisit
val squared = numbers.map { it * it }

// Pemfilteran dengan it
val even = numbers.filter { it % 2 == 0 }

println(squared) // [1, 4, 9, 16, 25]

Dalam contoh map { it * it } menggunakan it sebagai pengganti deklarasi n ->. Kotlin secara otomatis menetapkan it untuk satu-satunya parameter lambda. Jika lambda menerima dua atau lebih argumen, it tidak dibuat — semua parameter harus dideklarasikan secara eksplisit. Untuk keterbacaan lambda bersarang yang lebih baik, disarankan untuk memberikan nama yang bermakna pada parameter dan menggunakan it dalam predikat pendek satu baris.

Trailing lambda dan lambda multi-baris

Trailing lambda (lambda akhir) — fitur sintaksis Kotlin yang memungkinkan menempatkan argumen-lambda terakhir di luar tanda kurung bulat panggilan fungsi. Ini membuat kode mirip dengan konstruksi bahasa bawaan. Jika lambda adalah satu-satunya argumen, tanda kurung dapat dihilangkan sepenuhnya. Pendekatan ini digunakan secara aktif di pustaka standar dan DSL.

kotlin
// Panggilan standar
thread(block = {
    println("Halo dari utas")
})

// Versi trailing lambda
thread {
    println("Halo dari utas")
}

// repeat dengan trailing lambda
repeat(3) { index ->
    println("Iterasi $index")
}

// run dengan lambda multi-baris
val config = run {
    val host = "localhost"
    val port = 8080
    "$host:$port"
}

Fungsi thread menerima Runnable sebagai argumen terakhir. Berkat trailing lambda, lambda dapat diteruskan di luar tanda kurung, yang secara visual menyerupai blok kode. Fungsi repeat menerima jumlah iterasi dan lambda dengan indeks. run — contoh fungsi tingkat tinggi di mana lambda multi-baris menghitung nilai yang dikembalikan oleh ekspresi terakhir. Tanda kurung di sekitar run() dapat dihilangkan jika lambda adalah satu-satunya argumen.

Penangkapan variabel (closure) dalam lambda

Penangkapan variabel (closure) — kemampuan lambda untuk mengakses variabel yang dideklarasikan di ruang lingkup eksternal. Di Kotlin, lambda dapat membaca dan memodifikasi variabel var, serta membaca variabel val dari konteks sekitarnya. Variabel yang ditangkap disimpan bersama lambda sepanjang siklus hidupnya, memungkinkan pembuatan fungsi dengan keadaan.

kotlin
fun makeCounter(): () -> Int {
    var count = 0
    return {
        count++  // jumlah tangkapan
    }
}

fun main() {
    val counter = makeCounter()
    println(counter()) // 0
    println(counter()) // 1
    println(counter()) // 2
}

Fungsi makeCounter mendeklarasikan variabel lokal count dan mengembalikan lambda { count++ }. Meskipun makeCounter telah selesai bekerja, lambda yang dikembalikan mempertahankan referensi ke count melalui penutupan (closure). Setiap panggilan counter() menambah dan mengembalikan nilai saat ini. Mekanisme closure mendasari currying, pabrik fungsi, dan memoization. Penting untuk diingat bahwa penangkapan variabel yang dapat diubah dapat menyebabkan perilaku tak terduga dalam eksekusi paralel.

Pertanyaan yang sering diajukan

Bisakah lambda memiliki return?

Lambda tidak mendukung return tanpa syarat — return tanpa label mengembalikan kontrol ke fungsi eksternal. Untuk keluar dari lambda, gunakan return@label, di mana label adalah nama fungsi tingkat tinggi tempat lambda diteruskan.

Apa perbedaan antara lambda dan fungsi anonim?

Fungsi anonim ditulis sebagai fun(a: Int): Int { return a * 2 } dan mendukung return tanpa label. Lambda { a -> a * 2 } lebih pendek secara sintaksis, tetapi memerlukan return@label untuk keluar awal.

Bagaimana cara meneruskan lambda sebagai argumen tanpa panah?

Jika lambda tidak menerima argumen, panah dihilangkan: { body() }. Jika menerima satu argumen dan tidak menggunakannya, alih-alih panah ditulis { _ -> body() } dengan garis bawah untuk mengabaikan parameter.

Apakah lambda selalu membuat objek baru?

Ya, setiap lambda yang diteruskan ke fungsi non-inline membuat instance dari kelas anonim. Untuk fungsi inline, lambda disisipkan di tempat panggilan tanpa membuat objek. Lambda non-capturing di-cache dalam objek singleton.

Mengapa return tidak bisa digunakan langsung di lambda?

Return di Kotlin adalah operator lompat yang dimiliki oleh fungsi terdekat dengan fun. Lambda bukan fungsi (fun), melainkan ekspresi. Oleh karena itu, return di dalam lambda tanpa label dianggap sebagai pengembalian dari fungsi eksternal yang melingkupi.

Ringkasan

  • Lambda — fungsi anonim dalam sintaksis { args -> body }, diteruskan sebagai nilai ke fungsi tingkat tinggi
  • Nama implisit it menggantikan satu-satunya argumen dan membuat kode lebih ringkas dalam predikat pendek
  • Trailing lambda menempatkan lambda terakhir di luar tanda kurung panggilan untuk dibaca sebagai blok kode
  • Penangkapan (closure) memungkinkan lambda mengakses variabel dari konteks eksternal setelah fungsi melingkupi selesai
  • Tipe fungsional (T) -> R menentukan tanda tangan lambda dengan pemeriksaan pada tahap kompilasi
  • Fungsi inline menghilangkan pembuatan kelas anonim untuk lambda, meningkatkan kinerja dalam perulangan
  • Lambda multi-baris mengembalikan nilai dari ekspresi terakhir, mendukung perhitungan kompleks tanpa mendeklarasikan fungsi terpisah

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