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 ultimulidepășește lista (IndexOutOfBoundsException). Foloseștelista.indicessau0 until lista.size.- Modificarea listei în timpul parcurgerii cu
for(adăugare sau ștergere): apareConcurrentModificationException. Construiește o listă nouă sau foloseșteremoveIf. - Încercarea de a schimba variabila buclei (
oras = ...): esteval, 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.