Iterable.forEach în Kotlin

Execută o acțiune pentru fiecare element, în ordine; forEachIndexed primește și poziția.

Sintaxă
fun <T> Iterable<T>.forEach(actiune: (T) -> Unit)
fun <T> Iterable<T>.forEachIndexed(actiune: (index: Int, T) -> Unit)

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 return simplu într-un forEach din main: iese din toată funcția main, nu doar din element. Folosește return@forEach sau o buclă for.
  • Folosești forEach ca să construiești o listă nouă cu add. De obicei map sau filter fac 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.