for în Kotlin

Parcurge pe rând elementele unei colecții, ale unui interval sau ale oricărui obiect care are iterator().

Sintaxă
for (element in colectie) { ... }
for (i in 1..10) { ... }
for (i in lista.indices) { ... }
for ((index, valoare) in lista.withIndex()) { ... }
for ((cheie, valoare) in map) { ... }

Ce face for

for în Kotlin parcurge mereu ceva cu in: o listă, un tablou, un text (caracter cu caracter), un map sau un interval de numere. La fiecare pas, variabila dintre paranteze primește elementul următor. Ea este o val nouă la fiecare pas și nu se declară înainte.

Kotlin nu are bucla clasică for (int i = 0; i < n; i++). În locul ei folosești intervale: for (i in 0 until n) sau for (i in 0..<n), for (i in 10 downTo 1), for (i in 0..100 step 5). Pentru poziții într-o listă: lista.indices sau lista.withIndex().

Cu destructuring poți desface direct elementele: for ((nume, nota) in note) pentru un map sau o listă de perechi. Pentru a ieși din buclă sau a sări un pas folosești break și continue.

Exemple

Exemplul 1: Liste, texte și intervale

Același for parcurge o listă, literele unui text și un interval de numere.

fun main() {
    val orase = listOf("Iași", "Cluj", "Timișoara")
    for (oras in orase) {
        println("Livrăm în $oras")
    }

    for (litera in "Ana") {
        print("[$litera]")
    }
    println()

    var suma = 0
    for (i in 1..5) {
        suma += i
    }
    println("1+2+3+4+5 = $suma")
}

Rezultat

Livrăm în Iași
Livrăm în Cluj
Livrăm în Timișoara
[A][n][a]
1+2+3+4+5 = 15

Exemplul 2: Poziția elementului

withIndex() dă perechi (poziție, valoare). indices dă doar pozițiile valide.

fun main() {
    val clasament = listOf("Ana", "Mihai", "Ioana")
    for ((poz, nume) in clasament.withIndex()) {
        println("Locul ${poz + 1}: $nume")
    }

    val punctaje = intArrayOf(80, 95, 70)
    for (i in punctaje.indices) {
        punctaje[i] += 5   // bonus
    }
    println("Cu bonus: ${punctaje.joinToString()}")
}

Rezultat

Locul 1: Ana
Locul 2: Mihai
Locul 3: Ioana
Cu bonus: 85, 100, 75

Exemplul 3: Parcurgerea unui map

Fiecare intrare se desface în cheie și valoare. mapOf păstrează ordinea în care au fost adăugate perechile.

fun main() {
    val stoc = mapOf("mere" to 12, "pere" to 0, "prune" to 30)
    for ((fruct, kg) in stoc) {
        val stare = if (kg == 0) "epuizat" else "$kg kg"
        println("$fruct: $stare")
    }
    for (i in 10 downTo 0 step 5) {
        print("$i ")
    }
    println()
}

Rezultat

mere: 12 kg
pere: epuizat
prune: 30 kg
10 5 0

Greșeli frecvente

  • for (i in 0..lista.size): intervalul .. include capătul, deci ultimul i depășește lista (IndexOutOfBoundsException). Folosește lista.indices sau 0 until lista.size.
  • Modificarea listei în timpul parcurgerii cu for (adăugare sau ștergere): apare ConcurrentModificationException. Construiește o listă nouă sau folosește removeIf.
  • Încercarea de a schimba variabila buclei (oras = ...): este val, compilarea eșuează.

Comenzi înrudite

  • in și !in: in verifică dacă o valoare aparține unui interval, unei colecții sau unui text; tot in se folosește în for.
  • Range-uri (.., ..<, until, downTo, step): Intervale de numere sau caractere: .. include capătul, ..< și until îl exclud, downTo numără invers, step sare.
  • while și do-while: while repetă un bloc cât timp condiția e adevărată; do-while execută blocul o dată, apoi verifică condiția.
  • break și continue: break oprește bucla curentă; continue sare la pasul următor. Cu etichete (nume@) pot opri o buclă exterioară.
  • Destructuring (val (a, b) = ...): Destructuring desface un obiect în mai multe variabile deodată: val (nume, nota) = pereche.