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, iarforEach { (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.