Episode ini menguasai collection dan standard library Kotlin: List, Set, dan Map beserta operasi koleksinya, higher-order functions seperti map, filter, fold, dan flatMap, sequences dengan lazy evaluation, serta manipulasi string dan utility functions standar.

OOP sudah kalian kuasai di episode 4. Sekarang saatnya memanfaatkan kekuatan terbesar Kotlin: standard library dengan collection API yang sangat kaya. Dengan kombinasi List, Set, Map, dan higher-order functions, kalian bisa menulis transformasi data yang di Java butuh puluhan baris dalam satu ekspresi.
Standard library Kotlin dirancang fungsional: alih-alih menulis loop manual, kalian mengungkapkan niat dengan filter, map, dan fold. Kode menjadi deklaratif, lebih pendek, dan lebih mudah diuji.
Episode 5 ini akan membangun kebiasaan yang kalian pakai di seluruh series — dari episode 6 sampai episode 22.
Kotlin membedakan collection read-only dan mutable: listOf dan mutableListOf, setOf dan mutableSetOf, mapOf dan mutableMapOf. Collection read-only tidak bisa diubah, meskipun isinya tetap terlihat:
val daftar = listOf("apel", "pisang", "ceri")
val unik = setOf(1, 1, 2, 3)
val harga = mapOf("kopi" to 15000, "teh" to 8000)
println(daftar[0])
println(unik) // [1, 2, 3]
println(harga["kopi"])setOf otomatis menghilangkan duplikat, dan mapOf menyimpan pasangan key-value yang ditulis dengan infix to. Perhatikan bahwa koleksi ini read-only — untuk menambah elemen, pakai varian mutable.
Perbedaan penting: List dan MutableList adalah dua interface berbeda. Fungsi menerima List menjanjikan tidak mengubah isi; fungsi yang perlu mengubah memakai MutableList. Disiplin ini membuat kontrak fungsi lebih jelas dan mencegah efek samping yang tidak terduga.
Operasi collection paling sering dipakai adalah map untuk transformasi dan filter untuk penyaringan. Keduanya menerima lambda sebagai argumen:
val angka = listOf(1, 2, 3, 4, 5, 6)
val kuadrat = angka.map { it * it }
val genap = angka.filter { it % 2 == 0 }
println(kuadrat) // [1, 4, 9, 16, 25, 36]
println(genap) // [2, 4, 6]Lambda { it * it } memakai nama implisit it untuk elemen tunggal. Ekspresi filter di atas pada dasarnya menjalankan loop dengan maksud yang jelas — jauh lebih terbaca daripada loop manual. Kalian bisa menguji seluruh contoh dengan kotlinc Koleksi.kt -include-runtime -d koleksi.jar dan menjalankan JAR yang dihasilkan.
fold mengakumulasi seluruh elemen menjadi satu nilai dengan nilai awal tertentu. flatMap menggabungkan hasil transformasi yang berupa collection menjadi satu list datar:
val angka = listOf(1, 2, 3, 4, 5)
val total = angka.fold(0) { akumulator, nilai -> akumulator + nilai }
val pasangan = listOf("ab", "cd").flatMap { it.toList() }
println(total) // 15
println(pasangan) // [a, b, c, d]fold(0) memakai 0 sebagai nilai awal, lalu lambda menerima akumulator dan elemen. flatMap mem-flatten hasil — pola yang sering dipakai untuk membangun daftar dari relasi satu-ke-banyak.
Pada collection biasa, setiap operasi langsung menciptakan collection baru. Rantai map lalu filter akan memproses seluruh elemen dua kali dan mengalokasikan collection perantara. Sequence mengatasi ini dengan evaluasi lazy: elemen diproses satu per satu hanya saat dibutuhkan:
val hasil = (1..1_000_000)
.asSequence()
.filter { it % 3 == 0 }
.map { it * it }
.take(5)
.toList()
println(hasil)Dengan asSequence(), operasi filter dan map menunggu sampai take(5) dan toList() dipanggil. Untuk dataset besar atau rantai operasi panjang, sequence menghemat alokasi dan waktu — ukuran mental yang perlu kalian pegang dari sekarang.
Untuk collection kecil, sequence malah menambah overhead. Aturan praktis: pakai collection biasa untuk data kecil dan sederhana, beralih ke sequence saat data besar, rantai operasi panjang, atau saat mengambil hanya sebagian kecil hasil.
Standard library menyediakan banyak fungsi string yang ringkas. Beberapa yang paling sering dipakai:
val teks = " Kotlin itu Keren "
println(teks.trim())
println(teks.uppercase())
println(teks.lowercase())
println(teks.replace("Keren", "Powerful"))
println("a,b,c".split(","))
println("hello".repeat(3))trim, uppercase, replace, split, dan repeat adalah sebagian dari toolbox string. Ada juga contains, startsWith, substringAfter, dan removeSuffix yang akan kalian temui terus-menerus di kode produksi.
Fungsi utilitas collection lainnya melengkapi gudang senjata kalian:
val daftar = (1..10).toList()
println(daftar.take(3)) // [1, 2, 3]
println(daftar.drop(7)) // [8, 9, 10]
println(daftar.chunked(3)) // kelompok berisi 3
println(daftar.zip(daftar)) // pasangan elementake dan drop memotong dari depan, chunked memecah menjadi kelompok berukuran sama, dan zip menggabungkan dua collection menjadi pasangan. Kombinasi utilitas ini menulis logika pemrosesan yang biasanya panjang menjadi ekspresi satu baris.
Episode 5 membuka kekuatan collection dan standard library: List, Set, dan Map dengan kontrak read-only, higher-order functions seperti map, filter, fold, dan flatMap, sequence untuk evaluasi lazy pada data besar, serta beragam fungsi string dan utilitas collection.
Inti yang harus dibawa pulang:
listOf dan mutable dengan mutableListOf.map mentransformasi, filter menyaring, fold mengakumulasi.flatMap menggabungkan hasil transformasi menjadi list datar.Di episode 6 selanjutnya kita akan membahas null safety dan type system — nullable types dan safe call operator, elvis operator dan non-null assertions, smart casts dan type inference, hingga inline classes dan value classes yang membuat kode kalian aman dari null sejak kompilasi.