MutableMap.merge în Kotlin

Map-uri (dicționare) Java 8 (pe JVM)

Pune valoarea dacă cheia lipsește; dacă există, o combină cu cea veche folosind funcția dată (de exemplu adunare).

Sintaxă
fun merge(cheie: K, valoare: V, combinare: (V, V) -> V?): V?

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 scrie map[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.