Ce face Iterable.forEach
forEach { ... } este echivalentul unei bucle for (x in lista), scris ca apel de funcție. Este comod la capătul unui lanț: lista.filter { ... }.sortedBy { ... }.forEach { println(it) }.
forEachIndexed { index, element -> ... } dă și poziția, începând de la 0.
Diferență importantă față de for: în forEach nu poți folosi break sau continue ca în buclă. return@forEach sare doar la elementul următor (ca un continue). Dacă ai nevoie să te oprești, folosește o buclă for.
Parametri
| Parametru | Descriere |
|---|---|
actiune |
Funcția executată pentru fiecare element. Rezultatul ei este ignorat. |
Ce returnează
Nimic (Unit).
Exemple
Exemplul 1: Afișarea unei liste
Același rezultat cu forEach și cu forEachIndexed, al doilea cu numerotare.
fun main() {
val sarcini = listOf("cumpărat pâine", "plătit factura", "sunat la bunica")
sarcini.forEach { println("- $it") }
sarcini.forEachIndexed { i, sarcina -> println("${i + 1}) $sarcina") }
}
Rezultat
- cumpărat pâine
- plătit factura
- sunat la bunica
1) cumpărat pâine
2) plătit factura
3) sunat la bunica
Exemplul 2: La capătul unui lanț
Filtrăm, sortăm și afișăm într-o singură expresie.
fun main() {
val temperaturi = mapOf("Iași" to 14, "Constanța" to 19, "Brașov" to 9, "Timișoara" to 17)
temperaturi.entries
.filter { it.value >= 14 }
.sortedByDescending { it.value }
.forEach { println("${it.key}: ${it.value} °C") }
}
Rezultat
Constanța: 19 °C
Timișoara: 17 °C
Iași: 14 °C
Exemplul 3: return@forEach sare peste un element
return@forEach trece la elementul următor, nu oprește tot. De aceea „Radu” (care vine după produsul fără stoc) este tot afișat.
fun main() {
val stoc = mapOf("Ana" to 3, "Ion" to 0, "Radu" to 5)
stoc.keys.forEach { client ->
if (stoc.getValue(client) == 0) return@forEach
println("Pregătim comanda pentru $client")
}
println("Gata")
}
Rezultat
Pregătim comanda pentru Ana
Pregătim comanda pentru Radu
Gata
Greșeli frecvente
- Scrii
returnsimplu într-unforEachdinmain: iese din toată funcțiamain, nu doar din element. Foloseștereturn@forEachsau o buclăfor. - Folosești
forEachca să construiești o listă nouă cuadd. De obiceimapsaufilterfac asta mai clar.
Comenzi înrudite
Iterable.onEach: Execută o acțiune pentru fiecare element și întoarce aceeași colecție, ca lanțul de operații să continue.Iterable.withIndex: Pune lângă fiecare element poziția lui, ca perechi (index, valoare), utile în bucle for.Iterable.map: Creează o listă nouă în care fiecare element este rezultatul funcției aplicate elementului original.Map.forEach: Parcurge toate intrările unui map și execută o acțiune pentru fiecare pereche cheie–valoare.