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.

kotlin Contoh: deklarasi List
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.

kotlin Contoh: akses indeks
val hari = listOf("Senin", "Selasa", "Rabu")
println(hari[0])                 // Senin
println(hari.get(2))              // Rabu
println(hari.getOrElse(5) { "—" }) // —
println(hari.getOrNull(5))        // null
MetodePerilakuHasil jika indeks di luar rentang
list[i]Akses langsungMelempar IndexOutOfBoundsException
list.get(i)Sama dengan list[i]Melempar IndexOutOfBoundsException
list.getOrNull(i)Mengembalikan nullnull
list.getOrElse(i) { default }Mengembalikan defaultHasil 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 operator in — apakah elemen ada di list.
  • indexOf(x) — indeks pertama kemunculan x, atau -1 jika tidak ada.
  • first() / last() — elemen pertama dan terakhir.
  • isEmpty() / isNotEmpty() — pengecekan isi list.

Contoh Lengkap #

Berikut program lengkap yang memperagakan operasi-operasi di atas:

kotlin
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:

text
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: Jumat

Mari kita bedah baris-baris penting di atas:

  1. daftarHari[0]: subscript setara dengan daftarHari.get(0). Indeks 0 mengambil elemen pertama "Senin".
  2. getOrElse(9) { "(tidak ada)" }: jika indeks 9 di luar rentang, lambda dijalankan dan mengembalikan string default, bukan melempar eksepsi.
  3. "Sabtu" in daftarHari: operator in adalah bentuk singkat daftarHari.contains("Sabtu").
  4. nilai.count { it == 8 }: count dengan predicate menghitung jumlah elemen yang memenuhi kondisi, di sini 8 muncul tiga kali.
  5. daftarHari.first(): mengembalikan elemen pada indeks 0. Pada list kosong, metode ini melempar NoSuchElementException; gunakan firstOrNull() 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 for loop, forEach, atau forEachIndexed.
  • List mendukung operasi fungsional seperti map, filter, dan reduce yang akan kita bahas pada chapter operasi collection.

Referensi Lanjutan #

Setelah memahami list read-only, kita siap memasuki ranah MutableList di mana elemen dapat dimodifikasi secara langsung.