Iterable.withIndex în Kotlin

Pune lângă fiecare element poziția lui, ca perechi (index, valoare), utile în bucle for.

Sintaxă
fun <T> Iterable<T>.withIndex(): Iterable<IndexedValue<T>>

for ((index, valoare) in lista.withIndex()) { ... }

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 este for ((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.