Ce face Iterable.sum
sum() există pentru colecții și tablouri de numere: Int, Long, Double, Float, Short, Byte. Rezultatul are același tip ca elementele (pentru Int rezultatul este tot Int). O colecție goală are suma 0.
Aceeași funcție merge și pe tablouri: arrayOf(1, 2, 3).sum() sau intArrayOf(1, 2, 3).sum(). Pentru o listă de obiecte (produse, elevi) nu poți apela sum() direct: folosește sumOf { it.pret }.
Atenție la depășire: suma unor Int-uri mari poate trece de 2.147.483.647 și „se dă peste cap” fără eroare. Pentru sume mari transformă întâi în Long.
Ce returnează
Suma elementelor, de același tip numeric ca elementele; 0 pentru o colecție goală.
Exemple
Exemplul 1: Totalul cheltuielilor pe o săptămână
Lista are valori Int (lei întregi), deci suma este tot Int. Lista goală dă 0, fără eroare.
fun main() {
val cheltuieli = listOf(45, 120, 30, 80, 15, 200, 60)
println("Total: ${cheltuieli.sum()} lei")
val nimic = emptyList<Int>()
println("Total fără cheltuieli: ${nimic.sum()}")
}
Rezultat
Total: 550 lei
Total fără cheltuieli: 0
Exemplul 2: Suma pe tablouri și pe Double
sum() merge la fel pe Array<Int>, pe IntArray și pe o listă de Double. Kilogramele dau exact 4.5, dar 0.1 + 0.2 arată o zecimală în plus, din cauza reprezentării numerelor Double în baza 2.
fun main() {
val puncte = arrayOf(10, 25, 7)
val goluri = intArrayOf(2, 0, 3, 1)
val kilograme = listOf(1.5, 2.25, 0.75)
println(puncte.sum())
println(goluri.sum())
println(kilograme.sum())
println(listOf(0.1, 0.2).sum())
}
Rezultat
42
6
4.5
0.30000000000000004
Exemplul 3: Depășire la Int și soluția cu Long
Trei numere de două miliarde nu încap într-un Int, așa că suma iese negativă. Transformate în Long, suma este corectă.
fun main() {
val vanzari = listOf(2_000_000_000, 2_000_000_000, 2_000_000_000)
println("Int: ${vanzari.sum()}")
println("Long: ${vanzari.map { it.toLong() }.sum()}")
}
Rezultat
Int: 1705032704
Long: 6000000000
Greșeli frecvente
- Apelezi
sum()pe o listă de obiecte: nu compilează. Spune ce adunăm cusumOf { it.camp }. - Aduni multe valori
Intmari și primești un număr negativ: a avut loc o depășire. FoloseșteLong(sumOf { it.toLong() }).
Comenzi înrudite
Iterable.sumOf: Adună valoarea calculată de o funcție pentru fiecare element, de exemplu prețul fiecărui produs din coș.Iterable.average: Calculează media aritmetică a numerelor din colecție; întoarce mereu un Double.Iterable.count: Numără elementele colecției sau doar pe cele care îndeplinesc o condiție.Iterable.fold: Pornește de la o valoare inițială și o combină pe rând cu fiecare element, întorcând rezultatul final.Iterable.max: Găsește cel mai mare (max) sau cel mai mic (min) element; variantele OrNull întorc null pentru o colecție goală.