Data sering kali perlu disusun ulang sebelum bisa dibaca, misalnya memilah nilai yang lulus dan yang tidak, atau membagi daftar panjang menjadi kelompok kecil. Topik ini membahas groupBy untuk mengelompokkan elemen berdasarkan kunci hasil lambda, partition untuk membagi collection menjadi dua daftar, dan chunked untuk memotong collection dengan ukuran tetap. Ketiganya membentuk struktur baru tanpa mengubah data asalnya, dan seluruh contoh dijalankan dengan compiler Kotlin.
groupBy membentuk Map berisi List#
Fungsi groupBy menjalankan lambda pada setiap elemen dan menjadikan hasilnya sebagai kunci pengelompokan. Hasilnya bertipe Map<K, List<V>>, yaitu Map yang nilainya berupa daftar elemen dengan kunci yang sama. Lambda pembentuk kuncinya bebas, mulai dari hasil percabangan lulus atau remidi sampai huruf awal sebuah nama. Program berikut menerapkan dua bentuk kunci tersebut.
fun main() {
val nilai = listOf(80, 65, 90, 55, 75)
val status = nilai.groupBy { if (it >= 75) "lulus" else "remidi" }
println(status)
println(status["lulus"])
println(status["remidi"])
val siswa = listOf("Ali", "Budi", "Citra", "Andi", "Bayu")
val perAwalan = siswa.groupBy { it.first() }
println(perAwalan)
}# compiler Kotlin dan pustaka standar yang dipakai jalur ini
export PATH=/home/kal/my-project/tools/kotlinc/bin:/home/kal/my-project/tools/jdk-merged/bin:$PATH
export STDLIB=/home/kal/my-project/tools/kotlinc/lib/kotlin-stdlib.jar
# kompilasi main.kt menjadi out.jar, lalu jalankan programnya
kotlinc main.kt -d out.jar && java -cp "out.jar:$STDLIB" MainKt{lulus=[80, 90, 75], remidi=[65, 55]}
[80, 90, 75]
[65, 55]
{A=[Ali, Andi], B=[Budi, Bayu], C=[Citra]}Keluaran baris pertama memperlihatkan {lulus=[80, 90, 75], remidi=[65, 55]}, yaitu Map dengan dua kunci yang tiap kunci memuat daftar nilainya. Nilai kelompok kemudian dibaca seperti Map pada umumnya, sehingga status["lulus"] menghasilkan [80, 90, 75]. Contoh kedua mengelompokkan nama berdasarkan huruf awalnya, dan kunci baru dicatat ketika elemen pertama dengan kunci itu ditemukan. Kunci yang tidak memiliki elemen tidak muncul pada hasil, sehingga daftar kunci mengikuti isi data.
partition memilah menjadi dua daftar#
Fungsi partition membagi collection menjadi dua daftar dalam satu kali lewat, yaitu elemen yang lulus kondisi dan elemen yang tidak. Hasilnya bertipe Pair<List<V>, List<V>>, dan destrukturisasi val (a, b) = ... memisahkan keduanya menjadi dua variabel. Bentuk ini lebih ringkas daripada memanggil filter dua kali dengan kondisi dan negasinya.
fun main() {
val nilai = listOf(80, 65, 90, 55, 75)
val (lulus, remidi) = nilai.partition { it >= 75 }
println(lulus)
println(remidi)
}# kompilasi bagi.kt menjadi bagi.jar, lalu jalankan programnya
kotlinc bagi.kt -d bagi.jar && java -cp "bagi.jar:$STDLIB" BagiKt[80, 90, 75]
[65, 55]Variabel lulus memuat [80, 90, 75], sedangkan remidi memuat [65, 55], dan keduanya saling melengkapi tanpa elemen yang hilang. Urutan elemen pada tiap daftar mengikuti urutan asalnya. Sisi pertama Pair selalu menyimpan kelompok yang lulus kondisi, sehingga apabila kondisinya dibalik, isi kedua daftar ikut tertukar.
chunked memotong dengan ukuran tetap#
Fungsi chunked memotong collection menjadi beberapa daftar dengan ukuran maksimal yang ditentukan. Hasilnya bertipe List<List<V>>, dan potongan terakhir boleh lebih pendek bila jumlah elemen tidak habis dibagi. Bentuk ini cocok untuk membagi daftar panjang menjadi halaman atau kelompok kerja berukuran seragam.
fun main() {
val nama = listOf("Ali", "Budi", "Citra", "Dewi", "Eka", "Fajar", "Gita")
val rombongan = nama.chunked(3)
println(rombongan)
println(rombongan.size)
}# kompilasi potong.kt menjadi potong.jar, lalu jalankan programnya
kotlinc potong.kt -d potong.jar && java -cp "potong.jar:$STDLIB" PotongKt[[Ali, Budi, Citra], [Dewi, Eka, Fajar], [Gita]]
3Tujuh nama yang dipotong dengan chunked(3) menghasilkan tiga rombongan, yaitu dua potongan penuh berisi tiga nama dan satu potongan sisa berisi satu nama. Properti size pada hasil menghasilkan 3 karena yang dihitung adalah jumlah potongan, bukan jumlah elemennya. Ukuran potongan wajib bilangan positif, dan nilai nol ditolak dengan error IllegalArgumentException saat program berjalan.
Ringkasan#
groupBymenghasilkanMapyang kuncinya hasil lambda dan nilainya daftar elemen dengan kunci yang sama.partitionmenghasilkanPairberisi dua daftar, yaitu elemen yang lulus kondisi dan yang tidak, dalam satu kali lewat.chunkedmemotong collection menjadiListberisiListdengan ukuran maksimal tetap, dan potongan terakhir boleh lebih pendek.- Ketiganya membentuk struktur baru dan tidak mengubah collection asalnya.
Referensi#
- Collection operations — Kotlin Documentation
— Operasi
groupBy,partition, danchunkedbeserta contohnya pada dokumentasi resmi. - Collections overview — Kotlin Documentation — Peta keluarga collection Kotlin dan kelompok operasinya.