Iterable.max în Kotlin

Găsește cel mai mare (max) sau cel mai mic (min) element; variantele OrNull întorc null pentru o colecție goală.

Sintaxă
fun <T : Comparable<T>> Iterable<T>.max(): T
fun <T : Comparable<T>> Iterable<T>.maxOrNull(): T?
fun <T : Comparable<T>> Iterable<T>.min(): T
fun <T : Comparable<T>> Iterable<T>.minOrNull(): T?

Ce face Iterable.max

max() și min() întorc cel mai mare, respectiv cel mai mic element. Merg pe orice tip care se poate compara: numere, texte (ordine alfabetică după codul caracterelor), date calendaristice.

Pe o colecție goală max() și min() aruncă NoSuchElementException. maxOrNull() și minOrNull() întorc în acest caz null, pe care îl tratezi cu ?:.

Pentru o listă de obiecte (cel mai scump produs, elevul cu media cea mai mare) folosește maxBy / minBy. Pentru a compara doar două valori există maxOf(a, b).

Ce returnează

Elementul cel mai mare sau cel mai mic; variantele OrNull întorc null dacă nu există elemente.

Exemple

Exemplul 1: Cea mai mare și cea mai mică temperatură

Pe o listă de numere, max și min dau extremele. Diferența lor este amplitudinea.

fun main() {
    val temperaturi = listOf(12, 18, 23, 9, 15)
    val maxim = temperaturi.max()
    val minim = temperaturi.min()
    println("Maxima: $maxim °C, minima: $minim °C")
    println("Amplitudine: ${maxim - minim} grade")
}

Rezultat

Maxima: 23 °C, minima: 9 °C
Amplitudine: 14 grade

Exemplul 2: Colecție goală: varianta OrNull

maxOrNull întoarce null pe o listă goală, iar ?: dă un mesaj în locul lui. max() pe aceeași listă ar opri programul.

fun main() {
    val noteIon = listOf(7, 9, 6)
    val noteMaria = emptyList<Int>()

    println("Ion: ${noteIon.maxOrNull() ?: "fără note"}")
    println("Maria: ${noteMaria.maxOrNull() ?: "fără note"}")
    println("Cea mai mică notă a lui Ion: ${noteIon.minOrNull()}")
}

Rezultat

Ion: 9
Maria: fără note
Cea mai mică notă a lui Ion: 6

Exemplul 3: Max pe texte

Textele se compară caracter cu caracter. „Zalău” este după „Arad”, deci este maximul; „Arad” este minimul.

fun main() {
    val orase = listOf("Iași", "Arad", "Zalău", "Brașov")
    println("Primul alfabetic: ${orase.min()}")
    println("Ultimul alfabetic: ${orase.max()}")
}

Rezultat

Primul alfabetic: Arad
Ultimul alfabetic: Zalău

Greșeli frecvente

  • Apelezi max() pe o listă care poate fi goală: programul se oprește cu NoSuchElementException. Folosește maxOrNull().
  • Cod vechi (Kotlin 1.4-1.6) în care max() era depreciat: de la Kotlin 1.7 max() există din nou și întoarce o valoare non-null.
  • Compari texte cu diacritice: „Ștei” iese după „Zalău”, pentru că litera Ș are cod mai mare decât Z. Pentru ordinea din dicționar folosește un Collator (vezi sortedWith).

Comenzi înrudite

  • Iterable.maxBy: Întoarce elementul pentru care funcția dată are valoarea cea mai mare (maxBy) sau cea mai mică (minBy).
  • maxOf: Returnează cea mai mare (maxOf) sau cea mai mică (minOf) dintre două sau mai multe valori comparabile.
  • Iterable.sorted: Întoarce o listă nouă cu elementele în ordine crescătoare (sorted) sau descrescătoare (sortedDescending).
  • Iterable.sum: Adună toate numerele dintr-o listă, mulțime sau tablou și întoarce totalul.
  • Iterable.average: Calculează media aritmetică a numerelor din colecție; întoarce mereu un Double.