Iterable.maxBy în Kotlin

Calcule pe colecții (sumă, minim, maxim, fold) Kotlin 1.7 (maxByOrNull: 1.4)

Întoarce elementul pentru care funcția dată are valoarea cea mai mare (maxBy) sau cea mai mică (minBy).

Sintaxă
fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T
fun <T, R : Comparable<R>> Iterable<T>.maxByOrNull(selector: (T) -> R): T?
fun <T, R : Comparable<R>> Iterable<T>.minBy(selector: (T) -> R): T
fun <T, R : Comparable<R>> Iterable<T>.minByOrNull(selector: (T) -> R): T?

Ce face Iterable.maxBy

maxBy { ... } calculează pentru fiecare element o valoare (de exemplu media unui elev) și întoarce elementul întreg care are valoarea maximă, nu valoarea. minBy face invers.

Dacă mai multe elemente au aceeași valoare maximă, se întoarce primul dintre ele. Pe o colecție goală maxBy/minBy aruncă excepție; maxByOrNull/minByOrNull întorc null.

Dacă vrei doar valoarea (cea mai mare medie, nu elevul), folosește maxOf { it.medie }.

Parametri

Parametru Descriere
selector Funcția care dă valoarea după care se compară elementele.

Ce returnează

Elementul găsit; variantele OrNull întorc null pentru o colecție goală.

Exemple

Exemplul 1: Elevul cu media cea mai mare

maxBy întoarce obiectul Elev, deci putem afișa și numele, și media. minBy găsește media cea mai mică.

data class Elev(val nume: String, val medie: Double)

fun main() {
    val clasa = listOf(Elev("Ana", 9.40), Elev("Ion", 8.75), Elev("Maria", 9.85), Elev("Radu", 7.10))
    val primul = clasa.maxBy { it.medie }
    val ultimul = clasa.minBy { it.medie }
    println("Șef de promoție: ${primul.nume} (${primul.medie})")
    println("Media cea mai mică: ${ultimul.nume} (${ultimul.medie})")
}

Rezultat

Șef de promoție: Maria (9.85)
Media cea mai mică: Radu (7.1)

Exemplul 2: Cel mai lung nume și egalitatea

„Brașov” și „Craiova” nu au aceeași lungime, dar „Iași” și „Cluj” au amândouă 4 litere: minBy întoarce primul dintre ele.

fun main() {
    val orase = listOf("Iași", "Craiova", "Cluj", "Brașov")
    println("Cel mai lung: ${orase.maxBy { it.length }}")
    println("Cel mai scurt: ${orase.minBy { it.length }}")
}

Rezultat

Cel mai lung: Craiova
Cel mai scurt: Iași

Exemplul 3: Lista goală cu maxByOrNull

Niciun produs nu este în stoc, deci lista filtrată este goală și maxByOrNull întoarce null.

data class Produs(val nume: String, val pret: Int, val stoc: Int)

fun main() {
    val produse = listOf(Produs("laptop", 3500, 0), Produs("mouse", 80, 0))
    val disponibile = produse.filter { it.stoc > 0 }
    val celMaiScump = disponibile.maxByOrNull { it.pret }
    println(celMaiScump?.nume ?: "Nimic în stoc")
    println(produse.maxByOrNull { it.pret }?.nume)
}

Rezultat

Nimic în stoc
laptop

Greșeli frecvente

  • Aștepți ca maxBy { it.medie } să întoarcă media: întoarce elevul. Pentru valoare folosește maxOf { it.medie }.
  • Folosești maxBy pe o listă care poate fi goală (de exemplu după filter): apare NoSuchElementException. Folosește maxByOrNull.

Comenzi înrudite

  • Iterable.max: Găsește cel mai mare (max) sau cel mai mic (min) element; variantele OrNull întorc null pentru o colecție goală.
  • maxOf: Returnează cea mai mare (maxOf) sau cea mai mică (minOf) dintre două sau mai multe valori comparabile.
  • Iterable.sortedBy: Sortează elementele după valoarea calculată de o funcție, de exemplu elevii după medie sau orașele după populație.
  • Map.maxByOrNull: Găsește intrarea (cheie și valoare) pentru care funcția dată are valoarea maximă; null dacă map-ul e gol.
  • Iterable.find: Întoarce primul element care îndeplinește condiția sau null dacă nu există niciunul.