Map.forEach în Kotlin

Parcurge toate intrările unui map și execută o acțiune pentru fiecare pereche cheie–valoare.

Sintaxă
inline fun <K, V> Map<out K, V>.forEach(actiune: (Map.Entry<K, V>) -> Unit)
for ((cheie, valoare) in map) { ... }

Ce face Map.forEach

map.forEach { (cheie, valoare) -> ... } trece prin intrări în ordinea lor (pentru mapOf / mutableMapOf, ordinea de inserare). Parantezele din jurul (cheie, valoare) desfac intrarea în două variabile.

Pe JVM există și forma fără paranteze, forEach { cheie, valoare -> ... }, care vine din Java (BiConsumer). Ambele afișează același lucru. Alternativa clasică este bucla for ((cheie, valoare) in map), care permite și break sau return.

Parametri

Parametru Descriere
actiune Funcția executată pentru fiecare intrare.

Ce returnează

Nimic (Unit).

Exemple

Exemplul 1: Afișarea unui orar

Intrarea este desfăcută în (zi, materie). Ordinea este cea de inserare.

fun main() {
    val orar = mapOf("luni" to "Matematică", "marți" to "Română", "miercuri" to "Fizică")
    orar.forEach { (zi, materie) ->
        println("$zi: $materie")
    }
}

Rezultat

luni: Matematică
marți: Română
miercuri: Fizică

Exemplul 2: Cu it, cu doi parametri și cu for

Trei forme cu același rezultat: it.key/it.value, lambda cu doi parametri (din Java) și bucla for.

fun main() {
    val stoc = mapOf("mere" to 12, "pere" to 0)
    stoc.forEach { println("${it.key} = ${it.value}") }
    stoc.forEach { fruct, kg -> println("$fruct: $kg kg") }
    for ((fruct, kg) in stoc) {
        if (kg == 0) println("$fruct s-au terminat")
    }
}

Rezultat

mere = 12
pere = 0
mere: 12 kg
pere: 0 kg
pere s-au terminat

Exemplul 3: Totalul unei facturi

Adunăm într-o variabilă externă prețul × cantitatea pentru fiecare produs.

fun main() {
    val cantitati = mapOf("caiet" to 5, "pix" to 3)
    val preturi = mapOf("caiet" to 6.5, "pix" to 2.0)
    var total = 0.0
    cantitati.forEach { (produs, buc) ->
        val subtotal = buc * preturi.getValue(produs)
        println("$produs x$buc = $subtotal lei")
        total += subtotal
    }
    println("Total: $total lei")
}

Rezultat

caiet x5 = 32.5 lei
pix x3 = 6.0 lei
Total: 38.5 lei

Greșeli frecvente

  • Uiți parantezele: forEach { cheie, valoare -> } este forma Java cu doi parametri, iar forEach { (cheie, valoare) -> } este forma Kotlin cu desfacere. Pe JVM merg amândouă; pe alte platforme Kotlin doar a doua.
  • Modifici map-ul (adaugi sau ștergi chei) în timp ce îl parcurgi: ConcurrentModificationException.

Comenzi înrudite

  • Iterable.forEach: Execută o acțiune pentru fiecare element, în ordine; forEachIndexed primește și poziția.
  • Map.keys: Proprietățile keys, values și entries dau cheile, valorile și perechile cheie–valoare ale unui map.
  • Map.mapValues: Creează un map nou cu aceleași chei și valori transformate (mapValues) sau cu aceleași valori și chei transformate (mapKeys).
  • mapOf: Creează un map (dicționar cheie → valoare) din perechi scrise cu „to”; mutableMapOf dă unul pe care îl poți modifica.