Episode ini menguasai sisi fungsional Kotlin: lambda dan anonymous functions, function references, scope functions let, run, apply, also, dan with, pola immutability, serta functional idioms yang membuat kode lebih deklaratif dan mudah diuji.

Kotlin adalah bahasa yang menggabungkan OOP dan functional programming. Episode 7 fokus pada sisi fungsionalnya: lambda, anonymous functions, function references, dan scope functions yang menjadi ciri khas kode Kotlin modern.
Scope functions seperti let, run, apply, also, dan with mungkin terlihat ajaib di awal, tapi sebenarnya mereka hanya fungsi biasa dengan lambda yang menerima receiver. Memahami mereka berarti memahami setengah dari idiom kode Kotlin di production.
Setelah episode ini, kalian akan menulis transformasi data dengan gaya deklaratif dan memakai scope functions dengan sadar — bukan sekadar meniru dari StackOverflow.
Lambda adalah blok fungsi yang bisa disimpan dalam variabel atau dilewatkan sebagai argumen. Bentuk umumnya: parameter di dalam kurung, lalu body setelah panah:
val tambah: (Int, Int) -> Int = { a, b -> a + b }
val sapa = { nama: String -> "Halo, $nama" }
println(tambah(3, 4))
println(sapa("Budi"))Tipe lambda ditulis sebagai (Int, Int) -> Int — parameter di dalam kurung, tipe hasil setelah panah. Kotlin juga mengizinkan trailing lambda: jika lambda adalah argumen terakhir fungsi, kurung bisa dihilangkan, seperti yang sudah kalian lihat di filter { ... } pada episode 5.
Anonymous function mirip lambda tapi memakai kata kunci fun dan memungkinkan return yang jelas:
val angka = listOf(1, 2, 3, 4)
fun genap(n: Int): Boolean = n % 2 == 0
println(angka.filter(::genap))
println(angka.filter { it % 2 == 0 })::genap adalah function reference — mengubah fungsi bernama menjadi nilai fungsi. Kedua baris menghasilkan hasil yang sama; yang pertama memakai reference, yang kedua memakai lambda. Function reference berguna untuk fungsi yang sudah ada dan ingin dipakai ulang.
let memakai nilai sebagai argumen lambda (it) dan mengembalikan hasil lambda — sempurna untuk memproses nilai nullable:
val teks: String? = "hello"
val panjang = teks?.let { it.length } ?: 0
println(panjang) // 5run mirip let tapi memakai receiver (this) alih-alih parameter, dan juga mengembalikan hasil lambda. Pola teks?.let { it.length } hanya mengeksekusi lambda jika teks bukan null — kombinasi yang sangat umum di kode produksi.
apply mengembalikan receiver itu sendiri setelah menjalankan lambda dengan receiver this — sempurna untuk mengonfigurasi objek. also juga mengembalikan receiver, tapi lambda menerima it, cocok untuk log pencatatan:
class Pesanan {
var id: String = ""
var total: Int = 0
}
val p = Pesanan().apply {
id = "ORD-001"
total = 150000
}.also {
println("Pesanan dibuat: ${it.id}")
}apply memungkinkan menginisialisasi properties objek tanpa mengulangi nama objek, dan also menyelipkan efek samping seperti logging tanpa mengubah alur. Keduanya mengembalikan p yang sama.
with memakai receiver dan mengembalikan hasil lambda — berguna saat memanggil banyak method pada objek yang sama:
val hasil = with(StringBuilder()) {
append("A")
append("B")
toString()
}
println(hasil) // ABPanduan pemilihan: pakai let untuk transformasi nilai nullable, apply untuk inisialisasi objek, also untuk efek samping, run dan with untuk komputasi dalam konteks receiver. Jangan berlebihan — jika lambda membuat kode sulit dibaca, pakai statement biasa.
Kotlin mendorong immutability: val, collection read-only, dan data class dengan copy. Data immutable aman dibagikan antar thread, lebih mudah diprediksi, dan menjadi fondasi pemrograman fungsional:
data class Item(val nama: String, val harga: Int)
val items = listOf(
Item("Kopi", 15000),
Item("Teh", 8000),
Item("Susu", 12000),
)
val total = items
.filter { it.harga > 10000 }
.map { it.harga }
.sum()Rantai filter dan map tidak mengubah items — keduanya menghasilkan collection baru. Pola ini membuat data mengalir dari transformasi ke transformasi tanpa efek samping, dan hasilnya mudah diuji karena murni (pure function).
Beberapa idiom yang sering dipakai di kode Kotlin fungsional:
map dan filter untuk transformasi dan penyaringan tanpa loop manual.fold dan reduce untuk akumulasi nilai.data class dengan copy untuk memperbarui data immutable.Functional idioms paling kuat saat digabung dengan collection API episode 5. Misalnya menghitung rata-rata harga item tertentu menjadi satu baris ekspresi. Latihan berulang akan membuat pola ini otomatis muncul saat kalian menulis kode.
Episode 7 membuka sisi fungsional Kotlin: lambda dengan trailing lambda syntax, anonymous functions dan function references, kelima scope functions dengan kegunaan masing-masing, serta kebiasaan immutability yang membuat kode lebih aman dan mudah diuji.
Inti yang harus dibawa pulang:
(Params) -> Hasil.::namaFungsi membuat function reference untuk memakai ulang fungsi.let dan run mengembalikan hasil; apply dan also mengembalikan receiver.val, collection read-only, dan copy untuk data immutable.Di episode 8 selanjutnya kita akan membahas null-safe data handling — data classes dan destructuring declarations, sealed classes untuk state, Result type dan error handling idiomatis, serta serialisasi dengan kotlinx.serialization atau Jackson.