buildList în Kotlin

Construiește o listă, un map sau o mulțime pas cu pas într-un bloc, apoi o întoarce doar pentru citire.

Sintaxă
fun <E> buildList(builder: MutableList<E>.() -> Unit): List<E>
fun <K, V> buildMap(builder: MutableMap<K, V>.() -> Unit): Map<K, V>
fun <E> buildSet(builder: MutableSet<E>.() -> Unit): Set<E>

Ce face buildList

Uneori o listă se construiește cu if-uri și bucle, nu dintr-o singură expresie. buildList { ... } îți dă în bloc o listă modificabilă (accesibilă direct prin add, addAll, this), iar la final întoarce rezultatul ca List doar pentru citire.

Avantajul față de mutableListOf + modificări: variabila finală are tipul List, deci nimeni nu o mai poate schimba din greșeală. buildMap și buildSet funcționează la fel pentru map-uri (put, this[cheie] = valoare) și mulțimi.

Tipul elementelor se deduce de obicei din ce adaugi. Dacă nu se poate, îl scrii: buildList<String> { ... }.

Parametri

Parametru Descriere
builder Blocul în care adaugi elemente. În el, this este colecția modificabilă.

Ce returnează

List<E>, Map<K, V> sau Set<E> doar pentru citire.

Exemple

Exemplul 1: Meniu construit cu condiții

Elementele se adaugă doar dacă sunt îndeplinite condițiile. Rezultatul meniu este o List<String>.

fun meniu(esteAdmin: Boolean, mesajeNecitite: Int): List<String> = buildList {
    add("Acasă")
    add("Profil")
    if (mesajeNecitite > 0) add("Mesaje ($mesajeNecitite)")
    if (esteAdmin) {
        add("Utilizatori")
        add("Setări")
    }
}

fun main() {
    println(meniu(esteAdmin = false, mesajeNecitite = 0))
    println(meniu(esteAdmin = true, mesajeNecitite = 3))
}

Rezultat

[Acasă, Profil]
[Acasă, Profil, Mesaje (3), Utilizatori, Setări]

Exemplul 2: buildMap: prețuri cu TVA

În blocul buildMap, this[cheie] = valoare pune o pereche. La final obținem un Map doar pentru citire.

fun main() {
    val preturiFaraTva = listOf("pâine" to 4.0, "lapte" to 7.5, "brânză" to 30.0)
    val cuTva = buildMap {
        for ((produs, pret) in preturiFaraTva) {
            this[produs] = pret * 1.09
        }
        put("pungă", 0.5)
    }
    println(cuTva)
}

Rezultat

{pâine=4.36, lapte=8.175, brânză=32.7, pungă=0.5}

Exemplul 3: buildSet: litere folosite

Mulțimea ține fiecare literă o singură dată, în ordinea primei apariții.

fun main() {
    val nume = listOf("Ana", "Andrei", "Dan")
    val initiale = buildSet {
        for (n in nume) add(n.first())
        add('Z')
    }
    println(initiale)
}

Rezultat

[A, D, Z]

Greșeli frecvente

  • Încerci să modifici rezultatul după blocul buildList: este List, nu MutableList. Toate adăugările trebuie făcute în bloc.
  • Pui în bloc doar o expresie (de exemplu buildList { listOf(1, 2) }) și te aștepți ca lista să conțină elementele. Blocul nu întoarce nimic; trebuie să apelezi add sau addAll.

Comenzi înrudite

  • listOf: Creează o listă din elementele date: listOf pentru citire, mutableListOf și arrayListOf pentru o listă pe care o modifici.
  • mapOf: Creează un map (dicționar cheie → valoare) din perechi scrise cu „to”; mutableMapOf dă unul pe care îl poți modifica.
  • setOf: Creează o mulțime: o colecție fără duplicate, în care verifici rapid dacă un element există.
  • sequence: Construiește o secvență dintr-un bloc de cod care dă valori una câte una cu yield; codul se oprește și continuă la cerere.