Lambda Expression
Lambda Expression adalah function yang tidak memiliki nama.
Biasanya ketika membuat function di Kotlin, kita menggunakan keyword fun kemudian memberikan nama pada function tersebut.
Contoh function biasa:
fun sayHello(name: String): String {
return "Hello $name"
}
Function tersebut memiliki nama:
sayHello
Dengan Lambda Expression, kita dapat membuat function tanpa memberikan nama.
Contoh:
val sayHello: (String) -> String = {
"Hello $it"
}
Lambda tersebut tidak memiliki nama function seperti sayHello() pada deklarasi function biasa. Lambda disimpan ke dalam variable sayHello.
Function sebagai First-Class Citizen
Di Kotlin, function merupakan first-class citizen.
Artinya, function diperlakukan seperti tipe data lainnya.
Function dapat:
- Disimpan ke dalam variable.
- Dikirim sebagai parameter ke function lain.
- Dikembalikan dari sebuah function.
- Disimpan dalam collection seperti
ListatauArray.
Karena itu, kita dapat menyimpan lambda expression ke dalam variable.
Contoh:
val sayHello: (String) -> String = {
"Hello $it"
}
Kemudian lambda tersebut dapat dipanggil seperti function:
println(sayHello("Ucup"))
Output:
Hello Ucup
Sintaks Lambda Expression
Bentuk umum lambda expression:
{ parameter -> expression }
Contoh:
val sayHello: (String) -> String = { name ->
"Hello $name"
}
Bagian:
name
adalah parameter.
Sedangkan:
"Hello $name"
adalah expression yang menghasilkan nilai.
Function Type
Pada contoh:
val sayHello: (String) -> String = {
"Hello $it"
}
bagian:
(String) -> String
disebut Function Type.
Artinya:
(String) → String
Function tersebut:
- Menerima satu parameter
String. - Mengembalikan nilai
String.
Contoh lainnya:
(Int) -> Int
Artinya function menerima Int dan mengembalikan Int.
Sedangkan:
(String, Int) -> String
berarti function menerima dua parameter:
String
Int
dan mengembalikan:
String
Lambda dengan Dua Parameter
Lambda dapat memiliki lebih dari satu parameter.
Contoh:
val varLambda: (String, Int) -> String = { name: String, age: Int ->
val result = "Nama saya $name, usia saya $age tahun"
result
}
Lambda tersebut memiliki dua parameter:
name: String
age: Int
dan menghasilkan String.
Lambda dapat dipanggil:
println(varLambda("Ucup", 30))
Output:
Nama saya Ucup, usia saya 30 tahun
Return pada Lambda Expression
Pada lambda expression, kita tidak perlu menggunakan keyword return untuk mengembalikan nilai terakhir.
Expression terakhir secara otomatis menjadi nilai return.
Contoh:
val varLambda: (String, Int) -> String = { name: String, age: Int ->
val result = "Nama saya $name, usia saya $age tahun"
result
}
Expression terakhir:
result
secara otomatis menjadi nilai yang dikembalikan oleh lambda.
Kita tidak perlu menulis:
return result
Lambda dengan Satu Parameter
Jika lambda hanya memiliki satu parameter, Kotlin menyediakan keyword khusus:
it
it digunakan untuk mengakses parameter tersebut.
Contoh:
val name: (String) -> String = {
it.uppercase()
}
Lambda tersebut menerima satu parameter bertipe String.
Kita dapat memanggilnya:
println(name("ucup"))
Output:
UCUP
Mengapa Menggunakan it?
Tanpa menggunakan it, kita dapat menuliskan parameter secara eksplisit:
val name: (String) -> String = { value ->
value.uppercase()
}
Karena lambda hanya memiliki satu parameter, Kotlin memungkinkan kita menggunakan:
it
Sehingga menjadi:
val name: (String) -> String = {
it.uppercase()
}
Kedua cara tersebut memiliki hasil yang sama.
it Hanya untuk Satu Parameter
Keyword it hanya dapat digunakan secara otomatis ketika lambda memiliki satu parameter.
Contoh:
val upper: (String) -> String = {
it.uppercase()
}
Sedangkan jika lambda memiliki dua parameter:
val result: (String, Int) -> String = { name, age ->
"$name berusia $age tahun"
}
Kita tidak menggunakan it.
Parameter harus diberi nama:
name
age
Contoh Lambda dengan Beberapa Parameter
val biodata: (String, Int) -> String = { name, age ->
"Nama: $name, Usia: $age"
}
Penggunaan:
println(biodata("Ucup", 30))
Output:
Nama: Ucup, Usia: 30
Lambda dengan Satu Expression
Jika lambda hanya memiliki satu expression, penulisannya dapat dibuat sangat sederhana.
Contoh:
val kaliLima: (Int) -> Int = {
it * 5
}
Penggunaan:
println(kaliLima(10))
Output:
50
Lambda sebagai Variable
Lambda dapat disimpan dalam variable.
Contoh:
val sayHello: (String) -> String = {
"Hello $it"
}
Variable sayHello sekarang menyimpan sebuah function.
Kita dapat memanggilnya:
println(sayHello("Ucup"))
Output:
Hello Ucup
Hal ini menunjukkan bahwa function dapat diperlakukan seperti data.
Lambda sebagai Parameter Function
Karena function merupakan first-class citizen, lambda juga dapat dikirim sebagai parameter ke function lain.
Contoh:
fun sayHello(
name: String,
transform: (String) -> String
) {
println(transform(name))
}
Function sayHello() menerima dua parameter:
name
transform
Parameter transform merupakan function type:
(String) -> String
Pemanggilannya:
sayHello("ucup") {
it.uppercase()
}
Output:
UCUP
Method Reference
Selain lambda expression, Kotlin juga memungkinkan kita mengambil reference dari function yang sudah ada.
Fitur ini disebut Method Reference atau Function Reference.
Contoh function:
fun toUpper(value: String): String {
return value.uppercase()
}
Kita dapat membuat function reference menggunakan:
::toUpper
Kemudian menyimpannya ke variable:
val toNameUpperCase: (String) -> String = ::toUpper
Sekarang toNameUpperCase memiliki reference ke function toUpper().
Contoh Method Reference
fun toUpper(value: String): String {
return value.uppercase()
}
fun main() {
val toNameUpperCase: (String) -> String = ::toUpper
println(toNameUpperCase("budi"))
}
Output:
BUDI
Pada kode:
::toUpper
Kotlin mengambil reference dari function toUpper() tanpa langsung menjalankannya.
Function tersebut kemudian dapat dipanggil melalui variable:
toNameUpperCase("budi")
Lambda Expression vs Function Biasa
Function biasa:
fun toUpper(value: String): String {
return value.uppercase()
}
Lambda:
val toUpper: (String) -> String = {
it.uppercase()
}
Keduanya dapat menghasilkan hasil yang sama.
Function biasa memiliki nama:
toUpper
Sedangkan lambda tidak memiliki nama dan disimpan dalam variable:
toUpper
Contoh Program Lengkap
Berikut contoh dari beberapa konsep Lambda Expression:
fun main() {
// Lambda dengan dua parameter
val varLambda: (String, Int) -> String = { name, age ->
val result = "Nama saya $name, usia saya $age tahun"
result
}
println(varLambda("Ucup", 30))
// Lambda dengan satu parameter
val name: (String) -> String = {
it.uppercase()
}
println(name("ucup"))
// Function biasa
fun toUpper(value: String): String {
return value.uppercase()
}
// Function reference
val toNameUpperCase: (String) -> String = ::toUpper
println(toNameUpperCase("budi"))
}
Output:
Nama saya Ucup, usia saya 30 tahun
UCUP
BUDI
Perbedaan Lambda dan Function Reference
Lambda membuat function secara langsung:
val toUpper: (String) -> String = {
it.uppercase()
}
Sedangkan function reference mengambil reference dari function yang sudah dibuat:
fun toUpper(value: String): String {
return value.uppercase()
}
val toNameUpperCase: (String) -> String = ::toUpper
Keduanya dapat digunakan dengan cara yang sama:
println(toUpper("budi"))
atau:
println(toNameUpperCase("budi"))
Output:
BUDI
Kesimpulan
Lambda Expression adalah function yang tidak memiliki nama.
Contoh:
val name: (String) -> String = {
it.uppercase()
}
Lambda dapat disimpan dalam variable karena function di Kotlin merupakan first-class citizen.
Function type:
(String) -> String
berarti lambda menerima satu String dan mengembalikan String.
Jika lambda hanya memiliki satu parameter, kita dapat menggunakan:
it
Contoh:
val name: (String) -> String = {
it.uppercase()
}
Jika lambda memiliki lebih dari satu parameter, parameter harus dituliskan secara eksplisit:
val biodata: (String, Int) -> String = { name, age ->
"Nama: $name, Usia: $age"
}
Kotlin juga menyediakan Function Reference menggunakan operator ::.
Contoh:
val toNameUpperCase: (String) -> String = ::toUpper
Jadi, konsep utama Lambda Expression adalah:
Lambda Expression memungkinkan kita membuat function tanpa nama dan memperlakukan function tersebut seperti sebuah nilai yang dapat disimpan, dikirim, dan digunakan kembali.