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ștemaxOf { it.medie }. - Folosești
maxBype o listă care poate fi goală (de exemplu dupăfilter): apareNoSuchElementException. FoloseștemaxByOrNull.
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.