Iterable.reduce în Kotlin

Combină elementele pe rând, pornind de la primul element; nu primește valoare inițială.

Sintaxă
fun <S, T : S> Iterable<T>.reduce(operatie: (acc: S, T) -> S): S
fun <S, T : S> Iterable<T>.reduceOrNull(operatie: (acc: S, T) -> S): S?

Ce face Iterable.reduce

reduce seamănă cu fold, dar acumulatorul începe cu primul element. Apoi combină acumulatorul cu al doilea element, rezultatul cu al treilea și așa mai departe.

Pentru că nu are valoare inițială, rezultatul are tipul elementelor, iar pe o colecție goală reduce aruncă UnsupportedOperationException. reduceOrNull întoarce atunci null.

Parametri

Parametru Descriere
operatie Primește acumulatorul și elementul următor și întoarce noul acumulator.

Ce returnează

Rezultatul combinării tuturor elementelor.

Exemple

Exemplul 1: Produsul numerelor

Acumulatorul pornește de la 2 (primul element), apoi se înmulțește cu 3, cu 4 și cu 5.

fun main() {
    val numere = listOf(2, 3, 4, 5)
    val produs = numere.reduce { acc, n -> acc * n }
    println("Produs: $produs")
}

Rezultat

Produs: 120

Exemplul 2: Cel mai lung cuvânt, scris de mână

La fiecare pas păstrăm cuvântul mai lung dintre acumulator și elementul curent. La egalitate rămâne cel găsit primul.

fun main() {
    val cuvinte = listOf("soare", "curcubeu", "nor", "fulger")
    val lung = cuvinte.reduce { acc, cuv -> if (cuv.length > acc.length) cuv else acc }
    println(lung)
}

Rezultat

curcubeu

Exemplul 3: Lista goală cu reduceOrNull

reduce pe o listă goală ar opri programul. reduceOrNull întoarce null.

fun main() {
    val comenzi = emptyList<Int>()
    val total = comenzi.reduceOrNull { acc, n -> acc + n }
    println(total ?: "Nicio comandă")
}

Rezultat

Nicio comandă

Greșeli frecvente

  • Folosești reduce pe o colecție care poate fi goală: UnsupportedOperationException („Empty collection can’t be reduced”). Folosește fold cu valoare inițială sau reduceOrNull.
  • Vrei un rezultat de alt tip (de exemplu text din numere): reduce nu poate, pentru că acumulatorul are tipul elementelor. Folosește fold.

Comenzi înrudite

  • Iterable.fold: Pornește de la o valoare inițială și o combină pe rând cu fiecare element, întorcând rezultatul final.
  • Iterable.runningFold: Ca fold, dar întoarce lista cu toate valorile intermediare ale acumulatorului, de exemplu totalurile parțiale.
  • Iterable.sum: Adună toate numerele dintr-o listă, mulțime sau tablou și întoarce totalul.
  • Iterable.max: Găsește cel mai mare (max) sau cel mai mic (min) element; variantele OrNull întorc null pentru o colecție goală.