Iterable.sum în Kotlin

Adună toate numerele dintr-o listă, mulțime sau tablou și întoarce totalul.

Sintaxă
fun Iterable<Int>.sum(): Int
fun Iterable<Double>.sum(): Double
fun Array<out Int>.sum(): Int
fun IntArray.sum(): Int

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 cu sumOf { it.camp }.
  • Aduni multe valori Int mari și primești un număr negativ: a avut loc o depășire. Folosește Long (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ă.