Map.mapValues în Kotlin

Creează un map nou cu aceleași chei și valori transformate (mapValues) sau cu aceleași valori și chei transformate (mapKeys).

Sintaxă
fun <K, V, R> Map<out K, V>.mapValues(transformare: (Map.Entry<K, V>) -> R): Map<K, R>
fun <K, V, R> Map<out K, V>.mapKeys(transformare: (Map.Entry<K, V>) -> R): Map<R, V>

Ce face Map.mapValues

mapValues { ... } păstrează cheile și calculează o valoare nouă pentru fiecare intrare. Lambda primește intrarea întreagă (it.key, it.value), nu doar valoarea, așa că scrii it.value.

mapKeys { ... } păstrează valorile și calculează chei noi. Dacă două chei noi ies la fel, rămâne doar ultima intrare: verifică dacă transformarea păstrează cheile unice.

Parametri

Parametru Descriere
transformare Funcția care primește o intrare Map.Entry și întoarce valoarea nouă (sau cheia nouă).

Ce returnează

Un Map nou.

Exemple

Exemplul 1: Prețuri cu TVA

Cheile (produsele) rămân, valorile se înmulțesc cu 1.19. Folosim it.value, pentru că it este intrarea.

fun main() {
    val faraTva = mapOf("carte" to 50, "pix" to 4, "caiet" to 10)
    val cuTva = faraTva.mapValues { it.value * 119 / 100.0 }
    println(cuTva)
}

Rezultat

{carte=59.5, pix=4.76, caiet=11.9}

Exemplul 2: Chei transformate

Scriem codurile județelor cu litere mici. La a doua transformare, două chei devin aceeași literă, deci rămâne doar ultima intrare.

fun main() {
    val judete = mapOf("IS" to "Iași", "CJ" to "Cluj", "CT" to "Constanța")
    println(judete.mapKeys { it.key.lowercase() })
    println(judete.mapKeys { it.key.first() })
}

Rezultat

{is=Iași, cj=Cluj, ct=Constanța}
{I=Iași, C=Constanța}

Exemplul 3: Media fiecărui elev

Valoarea fiecărei intrări este o listă de note; o înlocuim cu media ei.

fun main() {
    val catalog = mapOf("Ana" to listOf(9, 10, 8), "Ion" to listOf(7, 6, 8, 9))
    val medii = catalog.mapValues { (_, note) -> note.average() }
    println(medii)
}

Rezultat

{Ana=9.0, Ion=7.5}

Greșeli frecvente

  • Scrii mapValues { it * 2 }: it este intrarea, nu valoarea, deci nu compilează. Scrie it.value * 2 sau desface cu (_, v) -> v * 2.
  • Folosești map { ... } pe un map și primești o listă, nu un map. Pentru a păstra structura de map folosește mapValues / mapKeys.

Comenzi înrudite

  • Iterable.map: Creează o listă nouă în care fiecare element este rezultatul funcției aplicate elementului original.
  • Map.filterKeys: Creează un map nou doar cu intrările ale căror chei (filterKeys) sau valori (filterValues) îndeplinesc o condiție.
  • Iterable.groupBy: Împarte elementele în grupe după o cheie și întoarce un map: cheie → lista elementelor din acea grupă.
  • Map.forEach: Parcurge toate intrările unui map și execută o acțiune pentru fiecare pereche cheie–valoare.