IntStream.sum în Java

sum adună numerele din IntStream; average dă media lor ca OptionalDouble (gol dacă nu există numere).

Sintaxă
int sum()
OptionalDouble average()

Ce face IntStream.sum

sum() returnează suma numerelor din stream, de tip int. Pentru un stream gol dă 0. Atenție: dacă suma depășește aproximativ 2,1 miliarde, rezultatul se „întoarce” la valori negative; pentru sume mari folosește asLongStream().sum() sau mapToLong.

average() returnează media aritmetică, de tip OptionalDouble. Este gol pentru un stream fără elemente, ca să nu împarți la zero. Scoți valoarea cu getAsDouble() sau, mai sigur, cu orElse(0).

Ce returnează

sum: un int. average: un OptionalDouble.

Exemple

Exemplul 1: Suma și media notelor

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> note = List.of(9, 7, 10, 8, 6);

        int suma = note.stream().mapToInt(Integer::intValue).sum();
        double media = note.stream().mapToInt(Integer::intValue).average().orElse(0);

        System.out.println("Suma: " + suma);
        System.out.println("Media: " + media);
    }
}

Rezultat

Suma: 40
Media: 8.0

Exemplul 2: Stream gol și depășirea lui int

Media unui stream gol nu există. Iar trei salarii mari adunate ca int dau un rezultat negativ, greșit.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        System.out.println("Sumă goală: " + IntStream.empty().sum());
        System.out.println("Medie goală: " + IntStream.empty().average());

        int[] sume = {1_500_000_000, 700_000_000, 400_000_000};
        System.out.println("Ca int: " + IntStream.of(sume).sum());
        System.out.println("Ca long: " + IntStream.of(sume).asLongStream().sum());
    }
}

Rezultat

Sumă goală: 0
Medie goală: OptionalDouble.empty
Ca int: -1694967296
Ca long: 2600000000

Greșeli frecvente

  • Apelezi average().getAsDouble() pe un stream care poate fi gol: primești NoSuchElementException. Folosește orElse(...).
  • Aduni numere mari cu sum() pe int și nu observi depășirea. Nu apare nicio eroare, doar un rezultat greșit.

Comenzi înrudite

  • IntStream: Un stream de numere int simple, cu sum, average, min, max; IntStream.of îl creează direct din valori.
  • IntStream.max: Returnează cel mai mare (max) sau cel mai mic (min) număr din IntStream, ca OptionalInt.
  • IntStream.summaryStatistics: Calculează într-o singură trecere numărul, suma, minimul, maximul și media numerelor din IntStream.
  • Stream.mapToInt: Transformă elementele în numere primitive (int, long, double) și dă acces la sum(), average(), max().
  • Collectors.summingInt: Adună un câmp numeric al elementelor (summingInt) sau îi calculează media (averagingDouble), de obicei pe grupuri.