Ce face Iterable.withIndex
withIndex() întoarce elementele „ambalate” în obiecte IndexedValue, care au două proprietăți: index și value. Se pot desface direct în bucla for: for ((i, x) in lista.withIndex()).
Este varianta pentru bucla for a funcțiilor forEachIndexed și mapIndexed. Spre deosebire de forEachIndexed, în buclă poți folosi break și continue.
Ce returnează
Un Iterable<IndexedValue<T>> (calculat pe măsură ce este parcurs).
Exemple
Exemplul 1: Buclă cu poziție
Desfacem fiecare pereche în loc și nume.
fun main() {
val podium = listOf("Ioana", "Vlad", "Sorina")
for ((loc, nume) in podium.withIndex()) {
println("Locul ${loc + 1}: $nume")
}
}
Rezultat
Locul 1: Ioana
Locul 2: Vlad
Locul 3: Sorina
Exemplul 2: Oprire cu break
Căutăm prima zi în care bugetul a fost depășit și ne oprim acolo.
fun main() {
val cheltuieli = listOf(40, 55, 30, 90, 20)
var total = 0
for ((zi, suma) in cheltuieli.withIndex()) {
total += suma
if (total > 150) {
println("Bugetul de 150 lei a fost depășit în ziua ${zi + 1} (total $total)")
break
}
}
println(cheltuieli.withIndex().toList().take(2))
}
Rezultat
Bugetul de 150 lei a fost depășit în ziua 4 (total 215)
[IndexedValue(index=0, value=40), IndexedValue(index=1, value=55)]
Greșeli frecvente
- Uiți parantezele la desfacere:
for (i, x in ...)nu compilează; corect estefor ((i, x) in lista.withIndex()).
Comenzi înrudite
Iterable.forEach: Execută o acțiune pentru fiecare element, în ordine; forEachIndexed primește și poziția.Iterable.map: Creează o listă nouă în care fiecare element este rezultatul funcției aplicate elementului original.List.indices: indices este intervalul pozițiilor valide ale listei (0..size-1); lastIndex este poziția ultimului element.