Map.getValue în Kotlin

Map-uri (dicționare) Kotlin 1.1 (getOrDefault: JVM)

Citește valoarea unei chei: getValue aruncă excepție dacă lipsește, getOrDefault și getOrElse dau o valoare de rezervă.

Sintaxă
operator fun <K, V> Map<out K, V>.get(cheie: K): V?          // map[cheie]
fun <K, V> Map<K, V>.getValue(cheie: K): V
fun getOrDefault(cheie: K, implicit: V): V
fun <K, V> Map<K, V>.getOrElse(cheie: K, implicit: () -> V): V

Ce face Map.getValue

map[cheie] (adică get) întoarce V?: valoarea sau null dacă cheia lipsește. De aceea trebuie tratat cu ?. sau ?:.

getValue(cheie) întoarce direct V (fără null), dar dacă cheia nu există aruncă NoSuchElementException. Folosește-l când știi sigur că cheia este acolo.

getOrDefault(cheie, implicit) întoarce valoarea de rezervă dată când cheia lipsește. getOrElse(cheie) { ... } face la fel, dar valoarea de rezervă vine dintr-o lambda, care se execută doar dacă e nevoie (util când rezerva este scumpă de calculat sau vrei să afișezi un mesaj). Niciuna nu adaugă cheia în map; pentru asta există getOrPut.

Parametri

Parametru Descriere
cheie Cheia căutată.
implicit Valoarea (sau lambda care o produce) întoarsă când cheia lipsește.

Ce returnează

Valoarea cheii, de tipul V (non-null).

Exemple

Exemplul 1: Patru feluri de a citi

Pentru „Brăila”, care lipsește, [] dă null, iar getOrDefault și getOrElse dau rezerva. getValue merge pentru o cheie existentă.

fun main() {
    val populatie = mapOf("Iași" to 271_000, "Cluj" to 286_000)

    println(populatie["Brăila"])
    println(populatie.getValue("Iași"))
    println(populatie.getOrDefault("Brăila", 0))
    println(populatie.getOrElse("Brăila") { -1 })
}

Rezultat

null
271000
0
-1

Exemplul 2: getValue pe o cheie lipsă

Prindem excepția ca să vedem mesajul ei. În cod real, folosește getValue doar când cheia sigur există.

fun main() {
    val preturi = mapOf("pâine" to 4.5, "lapte" to 7.0)
    try {
        println(preturi.getValue("cafea"))
    } catch (e: NoSuchElementException) {
        println("Eroare: ${e.message}")
    }
}

Rezultat

Eroare: Key cafea is missing in the map.

Exemplul 3: getOrElse cu mesaj

Lambda rulează doar pentru cheile care lipsesc, așa că mesajul apare o singură dată.

fun main() {
    val traduceri = mapOf("hello" to "salut", "cat" to "pisică")
    for (cuv in listOf("hello", "dog", "cat")) {
        val t = traduceri.getOrElse(cuv) {
            println("(lipsește traducerea pentru $cuv)")
            cuv
        }
        println("$cuv -> $t")
    }
}

Rezultat

hello -> salut
(lipsește traducerea pentru dog)
dog -> dog
cat -> pisică

Greșeli frecvente

  • Scrii map[cheie]!! ca să scapi de null: la o cheie lipsă primești NullPointerException fără niciun detaliu. getValue dă măcar un mesaj clar cu cheia lipsă.
  • Aștepți ca getOrDefault sau getOrElse să salveze rezerva în map: nu o salvează. Folosește getOrPut pe un MutableMap.

Comenzi înrudite

  • MutableMap.getOrPut: Întoarce valoarea cheii; dacă lipsește, o calculează cu lambda, o salvează în map și o întoarce.
  • Map.containsKey: Verifică dacă map-ul are o anumită cheie (containsKey, operatorul in) sau o anumită valoare (containsValue).
  • mapOf: Creează un map (dicționar cheie → valoare) din perechi scrise cu „to”; mutableMapOf dă unul pe care îl poți modifica.
  • List.getOrNull: Citește elementul de la o poziție fără risc: getOrNull dă null, getOrElse o valoare implicită când poziția nu există.