Iterable.sumOf în Kotlin

Adună valoarea calculată de o funcție pentru fiecare element, de exemplu prețul fiecărui produs din coș.

Sintaxă
fun <T> Iterable<T>.sumOf(selector: (T) -> Int): Int
fun <T> Iterable<T>.sumOf(selector: (T) -> Long): Long
fun <T> Iterable<T>.sumOf(selector: (T) -> Double): Double

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 uneori Int, alteori Double: compilatorul nu poate alege varianta și dă eroare de ambiguitate. Fă toate ramurile de același tip (0.0 pentru Double).
  • Folosești map { ... }.sum() pe colecții mari: merge, dar creează o listă în plus. sumOf face 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.