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
reducepe o colecție care poate fi goală:UnsupportedOperationException(„Empty collection can’t be reduced”). Foloseștefoldcu valoare inițială saureduceOrNull. - Vrei un rezultat de alt tip (de exemplu text din numere):
reducenu poate, pentru că acumulatorul are tipul elementelor. Foloseștefold.
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ă.