Ce face MutableMap.merge
merge(k, v) { vechi, nou -> ... } vine din Java (java.util.Map) și se folosește pe MutableMap pe JVM. Dacă cheia k nu există, pune direct v. Dacă există, apelează funcția cu valoarea veche și cu v și salvează rezultatul.
Este modul scurt de a număra sau de a aduna pe chei: map.merge(cuvant, 1, Int::plus). Dacă funcția întoarce null, cheia este ștearsă. merge întoarce valoarea nouă (sau null dacă a șters cheia).
Parametri
| Parametru | Descriere |
|---|---|
cheie |
Cheia de actualizat. |
valoare |
Valoarea pusă dacă cheia lipsește, sau combinată cu cea veche. |
combinare |
Funcția care primește valoarea veche și valoarea nouă și întoarce rezultatul (sau null pentru ștergere). |
Ce returnează
Valoarea nouă asociată cheii sau null dacă intrarea a fost ștearsă.
Exemple
Exemplul 1: Numărarea cuvintelor
La prima apariție se pune 1; la următoarele, Int::plus adună 1 la numărul existent.
fun main() {
val cuvinte = "ana are mere și ana are pere".split(" ")
val numar = mutableMapOf<String, Int>()
for (c in cuvinte) numar.merge(c, 1, Int::plus)
println(numar)
}
Rezultat
{ana=2, are=2, mere=1, și=1, pere=1}
Exemplul 2: Totaluri pe categorii
Adunăm cheltuielile pe categorie cu o lambda. Valoarea întoarsă de merge este totalul curent.
fun main() {
val bonuri = listOf("mâncare" to 45, "transport" to 10, "mâncare" to 30, "carte" to 50, "transport" to 12)
val totaluri = mutableMapOf<String, Int>()
for ((categorie, lei) in bonuri) {
val acum = totaluri.merge(categorie, lei) { vechi, nou -> vechi + nou }
println("$categorie: $acum lei")
}
println(totaluri)
}
Rezultat
mâncare: 45 lei
transport: 10 lei
mâncare: 75 lei
carte: 50 lei
transport: 22 lei
{mâncare=75, transport=22, carte=50}
Exemplul 3: Ștergere când rezultatul este null
Scădem din stoc bucățile vândute. Când stocul ajunge la 0, funcția întoarce null și produsul dispare din map.
fun main() {
val stoc = mutableMapOf("caiet" to 5, "pix" to 2)
val vandute = listOf("pix" to 2, "caiet" to 1)
for ((produs, buc) in vandute) {
stoc.merge(produs, buc) { vechi, scos -> (vechi - scos).takeIf { it > 0 } }
}
println(stoc)
}
Rezultat
{caiet=4}
Greșeli frecvente
- Te aștepți ca funcția să ruleze și la prima apariție a cheii: nu rulează; se pune direct valoarea dată.
- Folosești
mergeîn cod Kotlin comun (multiplatformă): există doar pe JVM. Acolo scriemap[k] = (map[k] ?: 0) + v.
Comenzi înrudite
MutableMap.put: Adaugă o cheie cu valoarea ei sau înlocuiește valoarea unei chei existente; putAll copiază toate intrările altui map.MutableMap.getOrPut: Întoarce valoarea cheii; dacă lipsește, o calculează cu lambda, o salvează în map și o întoarce.Iterable.groupingBy: Pregătește o grupare după cheie; eachCount() numără apoi câte elemente are fiecare cheie (frecvența).Map.forEach: Parcurge toate intrările unui map și execută o acțiune pentru fiecare pereche cheie–valoare.