Map.maxByOrNull în Kotlin

Găsește intrarea (cheie și valoare) pentru care funcția dată are valoarea maximă; null dacă map-ul e gol.

Sintaxă
fun <K, V, R : Comparable<R>> Map<out K, V>.maxByOrNull(selector: (Map.Entry<K, V>) -> R): Map.Entry<K, V>?
fun <K, V, R : Comparable<R>> Map<out K, V>.minByOrNull(selector: (Map.Entry<K, V>) -> R): Map.Entry<K, V>?

Ce face Map.maxByOrNull

maxByOrNull { it.value } parcurge intrările map-ului și întoarce intrarea întreagă cu valoarea cea mai mare, deci ai și cheia (key), și valoarea (value). minByOrNull găsește minimul.

Pe un map gol întoarce null, de aceea rezultatul se folosește cu ?. sau ?:. Există și maxBy, fără OrNull, care aruncă excepție pe un map gol. La egalitate se întoarce prima intrare.

Parametri

Parametru Descriere
selector Funcția care primește o intrare și dă valoarea după care se compară.

Ce returnează

Un Map.Entry<K, V>?.

Exemple

Exemplul 1: Luna cu cele mai mari vânzări

Rezultatul este o intrare: afișăm atât luna (cheia), cât și suma (valoarea).

fun main() {
    val vanzari = mapOf("ianuarie" to 12_400, "februarie" to 9_800, "martie" to 15_100, "aprilie" to 11_000)
    val maxim = vanzari.maxByOrNull { it.value }
    val minim = vanzari.minByOrNull { it.value }
    println("Cea mai bună lună: ${maxim?.key} (${maxim?.value} lei)")
    println("Cea mai slabă lună: ${minim?.key} (${minim?.value} lei)")
}

Rezultat

Cea mai bună lună: martie (15100 lei)
Cea mai slabă lună: februarie (9800 lei)

Exemplul 2: Cuvântul cel mai frecvent

Numărăm cuvintele cu groupingBy, apoi alegem intrarea cu numărul cel mai mare. Pe un map gol tratăm null.

fun main() {
    val text = "mere pere mere prune mere pere"
    val frecvente = text.split(" ").groupingBy { it }.eachCount()
    val top = frecvente.maxByOrNull { it.value }
    println(top?.let { "${it.key} apare de ${it.value} ori" })

    val gol = emptyMap<String, Int>()
    println(gol.maxByOrNull { it.value }?.key ?: "Nu sunt cuvinte")
}

Rezultat

mere apare de 3 ori
Nu sunt cuvinte

Greșeli frecvente

  • Scrii maxByOrNull { it }: it este intrarea, care nu se poate compara. Alege it.value sau it.key.
  • Vrei doar valoarea maximă: values.maxOrNull() este mai simplu.

Comenzi înrudite

  • Iterable.maxBy: Întoarce elementul pentru care funcția dată are valoarea cea mai mare (maxBy) sau cea mai mică (minBy).
  • Iterable.max: Găsește cel mai mare (max) sau cel mai mic (min) element; variantele OrNull întorc null pentru o colecție goală.
  • Iterable.groupingBy: Pregătește o grupare după cheie; eachCount() numără apoi câte elemente are fiecare cheie (frecvența).
  • Map.keys: Proprietățile keys, values și entries dau cheile, valorile și perechile cheie–valoare ale unui map.