IntStream.summaryStatistics în Java

Calculează într-o singură trecere numărul, suma, minimul, maximul și media numerelor din IntStream.

Sintaxă
IntSummaryStatistics summaryStatistics()

Ce face IntStream.summaryStatistics

Un stream se poate parcurge o singură dată, deci pentru sumă, minim și maxim ai avea nevoie de trei stream-uri. summaryStatistics() le calculează pe toate deodată și returnează un obiect IntSummaryStatistics.

Obiectul are metodele getCount(), getSum(), getMin(), getMax() și getAverage(). Pentru un stream gol, minimul este Integer.MAX_VALUE, maximul Integer.MIN_VALUE, iar media 0, deci verifică getCount() înainte.

Ce returnează

Un obiect IntSummaryStatistics (există și LongSummaryStatistics, DoubleSummaryStatistics).

Exemple

Exemplul 1: Statistica notelor unei grupe

import java.util.IntSummaryStatistics;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        IntSummaryStatistics s = IntStream.of(9, 7, 10, 5, 8).summaryStatistics();
        System.out.println("Note: " + s.getCount());
        System.out.println("Suma: " + s.getSum());
        System.out.println("Minima: " + s.getMin() + ", maxima: " + s.getMax());
        System.out.println("Media: " + s.getAverage());
        System.out.println(s);
    }
}

Rezultat

Note: 5
Suma: 39
Minima: 5, maxima: 10
Media: 7.8
IntSummaryStatistics{count=5, sum=39, min=5, average=7.800000, max=10}

Exemplul 2: Statistica prețurilor dintr-o listă de produse

Pentru o listă goală valorile sunt „ciudate”, de aceea verificăm întâi getCount().

import java.util.IntSummaryStatistics;
import java.util.List;

public class Main {
    record Produs(String nume, int pret) {}

    static void raport(List<Produs> produse) {
        IntSummaryStatistics s = produse.stream().mapToInt(Produs::pret).summaryStatistics();
        if (s.getCount() == 0) {
            System.out.println("Nu există produse (min = " + s.getMin() + ")");
            return;
        }
        System.out.printf("%d produse, între %d și %d lei, media %.2f lei%n",
                s.getCount(), s.getMin(), s.getMax(), s.getAverage());
    }

    public static void main(String[] args) {
        raport(List.of(new Produs("pâine", 5), new Produs("cafea", 32), new Produs("unt", 11)));
        raport(List.of());
    }
}

Rezultat

3 produse, între 5 și 32 lei, media 16.00 lei
Nu există produse (min = 2147483647)

Greșeli frecvente

  • Creezi trei stream-uri separate pentru sumă, minim și maxim. summaryStatistics() parcurge datele o singură dată.
  • Afișezi minimul unei liste goale și primești 2147483647. Verifică getCount() > 0.

Comenzi înrudite

  • IntStream.sum: sum adună numerele din IntStream; average dă media lor ca OptionalDouble (gol dacă nu există numere).
  • IntStream.max: Returnează cel mai mare (max) sau cel mai mic (min) număr din IntStream, ca OptionalInt.
  • Collectors.teeing: Trimite fiecare element la doi colectori deodată și unește cele două rezultate cu o funcție, într-o singură parcurgere.
  • Collectors.summingInt: Adună un câmp numeric al elementelor (summingInt) sau îi calculează media (averagingDouble), de obicei pe grupuri.