Lambda pada Kotlin
Lambda adalah fungsi tanpa nama, dapat diperlakukan sebagai value
- Lambda dapat diperlakukan sebagai value, contohnya bisa dimasukkan ke variabel dan argument.
- Lambda dapat mengakses variabel sesuai pada scope lambda tersebut didefinisikan.
Contoh deklarasi lambda:
var addLambda: (Int, Int) -> Int
addLambda membutuhkan dua nilai Int dan mengembalikan Int.
addLambda = { a: Int, b: Int -> Int
a + b
}// atau dapat disingkat
addLambda = { a, b ->
a + b
}
- Simbol -> menunjukkan tipe return-nya.
- Body lambda dimulai sesudah tipe return.
- Lambda akan mengembalikan value dari ekspresi terakhir body.
Untuk menggunakannya mirip dengan fungsi.
val lambda = addLambda(6,3) // 9
Untuk lambda yang hanya mempunyai satu parameter dapat dipersingkat lagi dengan menggunakan it keyword.
// lambda dengan satu parameter
var doubleLambda = { a: Int ->
2 * a
}// dapat disingkat
doubleLambda = { 2 * it }
Lambda sebagai argument
Misal fungsi berikut membutuhkan String sebagai dua argument pertama, dan argument ketiga bernama operation dan merupakan tipe fungsi.
fun manchesterUnitedDuo(striker1: String, striker2: String, operation: (String, String) -> String) : String { val result = operation(striker1, striker2)
println(result)
return result
}
Dengan menggunakan lambda untuk argument operation :
val duoStrikerLambda = ( a: String, b: String ->
"Manchester United dynamic duo $a and $b"
}manchesterUnitedDuo("Dwight Yorke", "Andy Cole", operation = duoStrikerLambda)// Manchester United dynamic duo is Dwight Yorke and Andy Cole
Bisa diringkas lagi dengan langsung mendefinisikan lambda ketika memanggil fungsi manchesterUnitedDuo.
manchesterUnitedDuo("Dwight Yorke", "Andy Cole", { a, b ->
"Manchester United dynamic duo $a and $b"
})
Bila lambda merupakan argument terakhir dari suatu fungsi, maka lambda bisa ditaruh di luar pemanggilan fungsi.
manchesterUnitedDuo("Dwight Yorke", "Andy Cole") { a, b ->
"Manchester United dynamic duo $a and $b"
}
Contoh dalam Android
Dalam Android kita sering memakai setOnClickListener.
// Pada Java
public interface OnClickListener {
void onClick(View v);
}view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
doSomething(v);
}
});// Pada Kotlin
view.setOnClickListener(object : OnClickListener {
override fun onClick(v: View) {
doSomething(v)
}
})
Dengan memakai lambda
fun setOnClickListener(listener: (v: View) -> Unit) {}view.setOnClickListener({ v -> doSomething(v) })
Karena lambda merupakan argument terakhir maka bisa dikeluarkan
view.setOnClickListener() { v -> doSomething(v) }
Dan karena lambda merupakan satu — satunya argument, maka kurung bisa di hilangkan.
view.setOnClickListener { v -> doSomething(v) }
Misal view tidak dipakai pada doSomething
view.setOnClickListener { doSomething() }
Lambda tanpa parameter dan return value
var noParameterLambda: () -> Unit = {
println("Glory Glory Man United!")
} noParameterLambda()
Tanpa return value, dengan menggunakan Unit.
Tanpa parameter, dengan menggunakan kurung buka — tutup yang kosong.
Lambda scope
Lambda dapat mengakses variabel pada scope ketika lambda didefinisikan.
var count = 0
val incrementCount = {
count += 1
}
Variabel count terletak di luar lambda, tetapi lambda dapat mengaksesnya karena lambda didefinisikan pada scope yang sama dengan variabel count.
Penggunaan lambda pada collection (array, list)
Lambda banyak berguna untuk memodifikasi collection.
Misal method sorted() pada array adalah untuk urut alphabet.
val names = arrayOf("xxxxx", "a", "cc", "bbb", "eeee")
names.sorted()// a, bbb, cc, eeee, xxxxx
Kita bisa menggunakan lambda untuk custom sort dengan compareBy()
val namesSortedByLength = names.sortedWith(compareBy {
it.length
})
// a, cc, bbb, eeee, xxxxx
Iterasi pada collections dengan menggunakan lambda
Pada kotlin collections mempunyai fitur yang mirip dengan functional programming. Yaitu fungsi — fungsi yang bisa diterapkan pada collections untuk melakukan modifikasi pada collections itu.
Loop elemen — elemen pada collections
val players = listOf("Gary", "Nemanja", "Rio", "Patrice")
players.forEach {
println("Manchester United player : $it")
}// Manchester United player : Gary
// Manchester United player : Nemanja
// Manchester United player : Rio
// Manchester United player : Patrice
Fungsi Filter
val goals = listOf(1, 4, 6, 10, 9)
val largeGoals = goals.filter {
it > 5
}// 6, 10, 9
Fungsi filter berisi
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T>
Fungsi filter() membutuhkan satu parameter, yaitu predicate yang berupa lambda yang mempunyai parameter T dan mengembalikan Boolean. Fungsi filter sendiri mengembalikan list T.
T di sini adalah type dari elemen dari list.
List yang dikembalikan dari fungsi filter adalah list yang baru. List original nya tidak dimodifikasi sama sekali.
Fungsi Map
val doubleGoals = goals.map {
it * 2
}// 2, 8, 12, 20, 18
Fungsi map menerima lambda, akan mengeksekusinya pada setiap item dari list dan mengembalikan list baru dengan urutan yang sama.
Fungsi map juga dapat mengubah tipe dari list.
val someInput = listOf("5", "7", "what", "23")
val numbers = someInput.map {
it.toIntOrNull()
}// 5, 7, null, 23// Kalau mau mem filter yang null, bisa memakai mapNotNull()
val numbers2 = someInput.mapNotNull {
it.toIntOrNull()
}
// 5, 7, 23
Fungsi Fold
- Fungsi fold mempunyai 2 buah parameter yaitu nilai awal dan sebuah lambda.
- Lambda-nya mempunyai 2 parameter yaitu nilai sekarang dan item elemen dari list.
- Lambda mengembalikan nilai berikutnya yang akan dipakai sebagai nilai sekarang lambda.
val goals = listOf(1, 4, 6, 10, 9)
var sum = goals.fold(0) { a, b ->
a + b
}// 30
Fungsi Reduce
Fungsi reduce mirip dengan fold, reduce menggunakan elemen pertama dari collections sebagai nilai awal.
sum = goals.reduce { a, b ->
a + b
}// 30
Kesimpulan
Pada tulisan ini kita belajar mengenai lambda pada kotlin.
- Lambda adalah fungsi tanpa nama.
- Lambda dapat dipakai sebagai argument fungsi.
- Contoh umum penggunaan lambda pada Android.
- Lambda punyai syntax yang lebih ringkas.
- Lambda dapat mengakses variabel sesuai pada scope lambda tersebut didefinisikan.
- Penggunaan lambda pada collections.