Skip to main content

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 List atau Array.

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:

tip

Lambda Expression memungkinkan kita membuat function tanpa nama dan memperlakukan function tersebut seperti sebuah nilai yang dapat disimpan, dikirim, dan digunakan kembali.