List adalah collection yang menyimpan elemen secara berurutan dan memberi kita akses berbasis indeks. Ketika kita membuat list dengan listOf(...), Kotlin memberi kita tipe List<T> yang bersifat read-only — kita bisa membaca tetapi tidak bisa menambah, menghapus, atau mengubah elemen. Pada chapter ini kita akan membahas cara membuat list, mengakses elemennya, dan melakukan query dasar yang menjadi pondasi hampir semua operasi collection.
Membuat List Read-Only #
List dibuat menggunakan fungsi pustaka listOf(...). Tipe elemen disimpulkan kompilator dari argumen yang kita berikan.
val namaHari: List<String> = listOf("Senin", "Selasa", "Rabu")
val angka = listOf(10, 20, 30) // List<Int>
val campuran = listOf("Budi", 25, 1.75) // List<Any>
val kosong: List<String> = emptyList()List boleh berisi duplikat. Tidak seperti Set, list menyimpan setiap kemunculan elemen sebagai entri terpisah dengan indeks berbeda. Inilah mengapa listOf(8, 7, 8) menghasilkan list dengan tiga elemen, bukan dua.
Akses Berbasis Indeks #
Elemen list dapat diakses melalui operator subscript list[i] atau melalui metode get(i). Indeks dimulai dari nol. Untuk mengakses indeks yang mungkin di luar rentang, Kotlin menyediakan varian aman.
val hari = listOf("Senin", "Selasa", "Rabu")
println(hari[0]) // Senin
println(hari.get(2)) // Rabu
println(hari.getOrElse(5) { "—" }) // —
println(hari.getOrNull(5)) // null| Metode | Perilaku | Hasil jika indeks di luar rentang |
|---|---|---|
list[i] | Akses langsung | Melempar IndexOutOfBoundsException |
list.get(i) | Sama dengan list[i] | Melempar IndexOutOfBoundsException |
list.getOrNull(i) | Mengembalikan null | null |
list.getOrElse(i) { default } | Mengembalikan default | Hasil lambda default |
Query Dasar #
List read-only menyediakan banyak operasi query tanpa mengubah isi. Berikut operasi yang paling sering kita pakai:
size— jumlah elemen.contains(x)atau operatorin— apakah elemen ada di list.indexOf(x)— indeks pertama kemunculanx, atau-1jika tidak ada.first()/last()— elemen pertama dan terakhir.isEmpty()/isNotEmpty()— pengecekan isi list.
Contoh Lengkap #
Berikut program lengkap yang memperagakan operasi-operasi di atas:
fun main() {
val daftarHari = listOf("Senin", "Selasa", "Rabu", "Kamis", "Jumat")
// Akses berdasarkan indeks
println("Hari pertama: ${daftarHari[0]}")
println("Hari ketiga: ${daftarHari[2]}")
// Akses aman dengan getOrNull dan getOrElse
println("Hari ke-10 (atau default): ${daftarHari.getOrElse(9) { "(tidak ada)" }}")
println("Hari ke-10 (atau null): ${daftarHari.getOrNull(9)}")
// Properti dan query dasar
println("Jumlah hari: ${daftarHari.size}")
println("Indeks \"Rabu\": ${daftarHari.indexOf("Rabu")}")
println("Indeks \"Minggu\" (jika tak ada): ${daftarHari.indexOf("Minggu")}")
println("Apakah ada \"Jumat\"? ${daftarHari.contains("Jumat")}")
println("Apakah ada \"Sabtu\"? ${"Sabtu" in daftarHari}")
// List boleh berisi duplikat
val nilai = listOf(8, 7, 8, 9, 7, 8)
println("Daftar nilai: $nilai")
println("Jumlah kemunculan 8: ${nilai.count { it == 8 }}")
// Iterasi sederhana
print("Hari kerja: ")
for (hari in daftarHari) {
print("$hari ")
}
println()
// List kosong dan first/last
val kosong: List<String> = emptyList()
println("List kosong? ${kosong.isEmpty()}")
println("List kosong size: ${kosong.size}")
println("Hari pertama: ${daftarHari.first()}")
println("Hari terakhir: ${daftarHari.last()}")
}Output yang Dihasilkan:
Hari pertama: Senin
Hari ketiga: Rabu
Hari ke-10 (atau default): (tidak ada)
Hari ke-10 (atau null): null
Jumlah hari: 5
Indeks "Rabu": 2
Indeks "Minggu" (jika tak ada): -1
Apakah ada "Jumat"? true
Apakah ada "Sabtu"? false
Daftar nilai: [8, 7, 8, 9, 7, 8]
Jumlah kemunculan 8: 3
Hari kerja: Senin Selasa Rabu Kamis Jumat
List kosong? true
List kosong size: 0
Hari pertama: Senin
Hari terakhir: JumatMari kita bedah baris-baris penting di atas:
daftarHari[0]: subscript setara dengandaftarHari.get(0). Indeks0mengambil elemen pertama"Senin".getOrElse(9) { "(tidak ada)" }: jika indeks9di luar rentang, lambda dijalankan dan mengembalikan string default, bukan melempar eksepsi."Sabtu" in daftarHari: operatorinadalah bentuk singkatdaftarHari.contains("Sabtu").nilai.count { it == 8 }:countdengan predicate menghitung jumlah elemen yang memenuhi kondisi, di sini8muncul tiga kali.daftarHari.first(): mengembalikan elemen pada indeks0. Pada list kosong, metode ini melemparNoSuchElementException; gunakanfirstOrNull()jika ragu.
Karakteristik List Read-Only #
Beberapa hal yang perlu kita ingat:
- List read-only bisa dilihat semua orang yang memiliki referensinya, tanpa risiko diubah.
- List tetap dapat diiterasi dengan
forloop,forEach, atauforEachIndexed. - List mendukung operasi fungsional seperti
map,filter, danreduceyang akan kita bahas pada chapter operasi collection.
Referensi Lanjutan #
- List API reference
— API reference
kotlin.collections.Listread-only - Collection elements
— operasi
get,contains,indexOf,first,last
Setelah memahami list read-only, kita siap memasuki ranah MutableList di mana elemen dapat dimodifikasi secara langsung.