Ce face Iterable.sumOf
sumOf { ... } trece prin elemente, calculează pentru fiecare un număr cu funcția dată și adună rezultatele. Este forma scurtă pentru map { ... }.sum(), dar fără lista intermediară.
Tipul rezultatului depinde de ce întoarce lambda: Int, Long, Double, UInt, ULong sau BigDecimal/BigInteger pe JVM. Dacă lambda întoarce it.pret * it.cantitate cu Double, rezultatul este Double.
Parametri
| Parametru | Descriere |
|---|---|
selector |
Funcția care dă numărul de adunat pentru fiecare element. |
Ce returnează
Suma valorilor calculate; 0 pentru o colecție goală.
Exemple
Exemplul 1: Valoarea coșului de cumpărături
Pentru fiecare produs calculăm preț × cantitate, iar sumOf adună rezultatele. Al doilea sumOf numără bucățile.
data class Produs(val nume: String, val pret: Double, val cantitate: Int)
fun main() {
val cos = listOf(
Produs("pâine", 4.5, 2),
Produs("lapte", 7.0, 3),
Produs("brânză", 25.0, 1),
)
val total = cos.sumOf { it.pret * it.cantitate }
val bucati = cos.sumOf { it.cantitate }
println("Produse: $bucati bucăți")
println("De plată: $total lei")
}
Rezultat
Produse: 6 bucăți
De plată: 55.0 lei
Exemplul 2: Numărul total de litere
Lambda întoarce un Int (lungimea fiecărui nume), deci rezultatul este Int.
fun main() {
val orase = listOf("Iași", "Cluj-Napoca", "Sibiu", "Constanța")
println("Litere în total: ${orase.sumOf { it.length }}")
}
Rezultat
Litere în total: 29
Exemplul 3: Sumă în Long, fără depășire
Convertim fiecare valoare în Long chiar în lambda, așa că adunarea nu mai depășește limita lui Int.
fun main() {
val vizualizari = listOf(1_500_000_000, 900_000_000, 1_200_000_000)
val total: Long = vizualizari.sumOf { it.toLong() }
println("Vizualizări: $total")
}
Rezultat
Vizualizări: 3600000000
Greșeli frecvente
- Scrii
sumOf { 0 }sau o lambda care întoarce uneoriInt, alteoriDouble: compilatorul nu poate alege varianta și dă eroare de ambiguitate. Fă toate ramurile de același tip (0.0pentruDouble). - Folosești
map { ... }.sum()pe colecții mari: merge, dar creează o listă în plus.sumOfface același lucru direct.
Comenzi înrudite
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.Iterable.fold: Pornește de la o valoare inițială și o combină pe rând cu fiecare element, întorcând rezultatul final.Iterable.maxBy: Întoarce elementul pentru care funcția dată are valoarea cea mai mare (maxBy) sau cea mai mică (minBy).Iterable.map: Creează o listă nouă în care fiecare element este rezultatul funcției aplicate elementului original.