List în Kotlin

Tipul listei doar pentru citire: elemente în ordine, accesate după poziție, fără funcții de adăugare sau ștergere.

Sintaxă
interface List<out E> : Collection<E>

val nume: List<T> = listOf(v1, v2, v3)

Ce face List

List<T> este o colecție ordonată de elemente de tipul T. Fiecare element are o poziție (index) care începe de la 0: lista[0] este primul element, lista.size spune câte elemente sunt.

În Kotlin, List este doar pentru citire: nu are add sau remove. Pentru o listă pe care o modifici folosești MutableList<T> (creată cu mutableListOf). Orice MutableList este și o List, deci o poți da unei funcții care cere List.

„Doar pentru citire” nu înseamnă „imuabilă”: dacă în spatele unei List stă o MutableList, altcineva o poate modifica. Pentru parametrii funcțiilor este totuși alegerea bună: funcția promite că nu schimbă lista.

Parametri

Parametru Descriere
E / T Tipul elementelor: Int, String, o clasă proprie. Toate elementele au același tip.

Ce returnează

Un tip (interfață), nu o funcție. Liste concrete creezi cu listOf, mutableListOf, buildList sau cu funcții care întorc liste (map, filter).

Exemple

Exemplul 1: Citire după poziție și parcurgere

Parantezele drepte citesc elementul de la o poziție. Bucla for trece prin elemente în ordine.

fun main() {
    val orase: List<String> = listOf("Iași", "Cluj", "Brașov")

    println(orase)
    println("Primul oraș: ${orase[0]}")
    println("Câte orașe: ${orase.size}")

    for (oras in orase) {
        println("- $oras")
    }
}

Rezultat

[Iași, Cluj, Brașov]
Primul oraș: Iași
Câte orașe: 3
- Iași
- Cluj
- Brașov

Exemplul 2: Parametru de tip List

Funcția medie cere o List<Int>, deci promite că doar citește. Îi putem da și o MutableList, pentru că orice listă modificabilă este și o listă.

fun medie(note: List<Int>): Double {
    var suma = 0
    for (nota in note) suma += nota
    return suma.toDouble() / note.size
}

fun main() {
    val noteAna = listOf(9, 10, 8)
    val noteIon = mutableListOf(7, 6)
    noteIon.add(8)

    println("Ana: ${medie(noteAna)}")
    println("Ion: ${medie(noteIon)}")
}

Rezultat

Ana: 9.0
Ion: 7.0

Exemplul 3: Două liste sunt egale dacă au aceleași elemente

== compară conținutul, în ordine, nu tipul concret al listei.

fun main() {
    val a = listOf(1, 2, 3)
    val b = mutableListOf(1, 2, 3)
    val c = listOf(3, 2, 1)

    println(a == b)
    println(a == c)
}

Rezultat

true
false

Greșeli frecvente

  • Încerci lista.add(x) pe o List: nu compilează, pentru că List nu are funcții de modificare. Creează lista cu mutableListOf.
  • Citești lista[lista.size]: ultima poziție validă este size - 1. Programul se oprește cu IndexOutOfBoundsException. Folosește getOrNull sau lastOrNull când nu ești sigur.

Comenzi înrudite

  • listOf: Creează o listă din elementele date: listOf pentru citire, mutableListOf și arrayListOf pentru o listă pe care o modifici.
  • buildList: Construiește o listă, un map sau o mulțime pas cu pas într-un bloc, apoi o întoarce doar pentru citire.
  • List.getOrNull: Citește elementul de la o poziție fără risc: getOrNull dă null, getOrElse o valoare implicită când poziția nu există.
  • Iterable.first: first/last întorc primul sau ultimul element (sau primul care îndeplinește o condiție); variantele OrNull dau null în loc de excepție.
  • Iterable.forEach: Execută o acțiune pentru fiecare element, în ordine; forEachIndexed primește și poziția.