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: esteList, nuMutableList. 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ă apeleziaddsauaddAll.
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.