Lambda adalah function literal: blok kode yang dapat diperlakukan sebagai nilai, disimpan dalam variabel, dan diteruskan sebagai argumen tanpa perlu nama. Di Kotlin, lambda berperan besar dalam pemrograman fungsional dan menjadi dasar banyak API standard library seperti map, filter, dan forEach. Pada chapter ini kita akan memahami cara mendeklarasikan lambda, menyimpannya dalam variabel bertipe function, dan memanggilnya baik secara langsung maupun melalui operator invoke. Pemahaman lambda ini menjadi fondasi untuk bab-bab selanjutnya tentang higher-order function, trailing lambda, dan scope functions.
Apa Itu Lambda Expression #
Lambda expression adalah sintaks ringkas untuk membuat function tanpa nama (anonymous function literal). Sintaksnya dibungkus kurung kurawal { ... } dan dapat langsung diikat ke variabel. Bentuk umumnya adalah { parameter -> body }, dan bila tidak ada parameter, kita dapat menulis { body } saja.
val sum: (Int, Int) -> Int = { a, b -> a + b }Pada baris di atas, sum adalah variabel bertipe function (Int, Int) -> Int — yaitu function yang menerima dua Int dan mengembalikan Int. Lambda { a, b -> a + b } mengisi nilai variabel tersebut.
Mendeklarasikan dan Memanggil Lambda #
Lambda dapat dipanggil seperti function biasa menggunakan tanda kurung (), atau melalui operator invoke(). Kedua cara menghasilkan perilaku yang sama persis; pemilihan hanya soal gaya penulisan.
// lambda_expressions.kt
// Contoh dasar lambda expression di Kotlin.
fun main() {
// Lambda disimpan dalam variabel bertipe function.
val sum: (Int, Int) -> Int = { a, b -> a + b }
// Pemanggilan langsung seperti function biasa.
println("sum(1, 2) = ${sum(1, 2)}")
// Pemanggilan via operator invoke().
println("sum.invoke(3, 4) = ${sum.invoke(3, 4)}")
// Lambda tanpa parameter — tipe () -> Unit.
val sapa: () -> Unit = { println("Halo, Budi!") }
sapa()
// Lambda tanpa parameter yang mengembalikan nilai.
val buatPesan: () -> String = { "Pesanan siap diproses" }
println(buatPesan())
// Lambda sebagai argumen function standard library.
val daftar = listOf(10, 20, 30)
val hasil = daftar.map { it * 2 }
println("Hasil map: $hasil")
// Type inference tanpa anotasi tipe eksplisit.
val kuadrat = { n: Int -> n * n }
println("Kuadrat 5 = ${kuadrat(5)}")
}Output yang Dihasilkan:
sum(1, 2) = 3
sum.invoke(3, 4) = 7
Halo, Budi!
Pesanan siap diproses
Hasil map: [20, 40, 60]
Kuadrat 5 = 25Mari kita telaah baris-baris kode di atas:
- Baris 6 (
val sum: (Int, Int) -> Int = { a, b -> a + b }): variabelsumbertipe function(Int, Int) -> Int. Lambda{ a, b -> a + b }menerima dua parameteradanb, lalu mengembalikan hasila + b. - Baris 9 (
sum(1, 2)): pemanggilan langsung seperti function biasa. Kotlin mengeluarkan hasil3. - Baris 12 (
sum.invoke(3, 4)): operatorinvoke()adalah cara eksplisit memanggil lambda. Hasilnya sama dengansum(3, 4). - Baris 15 (
val sapa: () -> Unit = { println(...) }): lambda tanpa parameter bertipe() -> Unit. Tidak mengembalikan nilai. - Baris 19 (
val buatPesan: () -> String = { ... }): lambda tanpa parameter yang mengembalikanString. Ekspresi terakhir dalam body menjadi nilai kembalian. - Baris 24 (
daftar.map { it * 2 }): lambda{ it * 2 }diteruskan sebagai argumen ke functionmap. Identifieritmerujuk ke setiap elemen daftar. - Baris 28 (
val kuadrat = { n: Int -> n * n }): type inference menyimpulkan tipe(Int) -> Intdari tipe parametern. Kita tidak perlu menuliskan tipe variabel secara eksplisit.
Tipe Function dan Inference #
Kotlin menggunakan function type seperti (Int, Int) -> Int untuk mendeskripsikan lambda. Tipe ini dapat dituliskan eksplisit atau disimpulkan kompilator dari body lambda. Saat kompilator tidak memiliki konteks yang cukup (misalnya lambda ditempatkan pada variabel tanpa anotasi tipe dan tanpa parameter bertipe), kita perlu menambahkan tipe pada parameter lambda seperti { n: Int -> n * n }.
Lambda dalam Standard Library #
Banyak function di standard library Kotlin menerima lambda sebagai argumen. Contoh paling umum adalah map, filter, forEach, groupBy, dan sortedBy. Setiap function ini mengiterasi koleksi dan menerapkan lambda yang kita berikan pada setiap elemen. Kita akan mendalami pola ini lebih jauh pada chapter Trailing Lambdas dan Higher-Order Functions.
Referensi Lanjutan #
- Higher-order functions and lambdas — panduan resmi lambda expression dan function literal
- Scope functions
— lambda sebagai dasar
let,run,apply,also,with
Penutup #
Lambda adalah blok bangunan utama pemrograman fungsional di Kotlin. Dengan kemampuan menyimpan function dalam variabel, meneruskannya sebagai argumen, dan memanggilnya baik secara langsung maupun via invoke, lambda membuat kode koleksi dan callback menjadi ringkas. Selanjutnya, kita akan membedah anatomi sintaks lambda — parameter, arrow ->, body multi-statement, dan nilai kembalian — pada chapter Lambda Syntax.