IntStream în Java

Un stream de numere int simple, cu sum, average, min, max; IntStream.of îl creează direct din valori.

Sintaxă
import java.util.stream.IntStream;

public interface IntStream extends BaseStream<Integer, IntStream>
static IntStream of(int... valori)

Ce face IntStream

IntStream este varianta de Stream pentru numere int. Numerele nu sunt împachetate în obiecte Integer, deci calculele sunt mai rapide, iar interfața are metode în plus: sum(), average(), min(), max(), summaryStatistics().

Obții un IntStream cu IntStream.of(5, 8, 10), cu IntStream.range(0, 10), din tablouri cu Arrays.stream(int[]) sau din alt stream cu mapToInt(...). Literele unui text dau un IntStream prin text.chars().

Pentru long și double există LongStream și DoubleStream, cu aceleași metode. Înapoi la Stream<Integer> treci cu boxed() sau mapToObj(...).

Parametri

Parametru Descriere
valori Pentru of: numerele, separate prin virgulă, sau un tablou int[].

Ce returnează

IntStream.of returnează un IntStream cu valorile date, în ordine.

Exemple

Exemplul 1: IntStream.of și operațiile pe numere

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        System.out.println("Suma notelor: " + IntStream.of(9, 7, 10, 8).sum());
        System.out.println("Nota maximă: " + IntStream.of(9, 7, 10, 8).max().getAsInt());

        int[] pare = IntStream.of(3, 8, 5, 12, 6).filter(n -> n % 2 == 0).toArray();
        System.out.println("Pare: " + pare.length + " numere, primul " + pare[0]);
    }
}

Rezultat

Suma notelor: 34
Nota maximă: 10
Pare: 3 numere, primul 8

Exemplul 2: De unde mai vin IntStream-uri

Dintr-un tablou, dintr-o listă de obiecte cu mapToInt și din literele unui text cu chars().

import java.util.Arrays;
import java.util.List;

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

    public static void main(String[] args) {
        int[] varste = {21, 34, 19, 45};
        System.out.println("Vârsta medie: " + Arrays.stream(varste).average().orElse(0));

        List<Produs> cos = List.of(new Produs("pâine", 5), new Produs("cafea", 32));
        System.out.println("Total coș: " + cos.stream().mapToInt(Produs::pret).sum() + " lei");

        long vocale = "Bucuresti".chars().filter(c -> "aeiouAEIOU".indexOf(c) >= 0).count();
        System.out.println("Vocale: " + vocale);
    }
}

Rezultat

Vârsta medie: 29.75
Total coș: 37 lei
Vocale: 4

Greșeli frecvente

  • Folosești Stream<Integer> și cauți sum(). Nu există pe Stream; treci la IntStream cu mapToInt(Integer::intValue).
  • Scrii Stream.of(tablouInt) pentru un int[]: primești un stream cu un singur element (tabloul). Folosește IntStream.of(tablou) sau Arrays.stream(tablou).

Comenzi înrudite

  • IntStream.range: Creează șirul de numere întregi dintre două limite: range fără ultima valoare, rangeClosed cu ea inclusă.
  • 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.
  • Stream.mapToInt: Transformă elementele în numere primitive (int, long, double) și dă acces la sum(), average(), max().
  • IntStream.mapToObj: Trece de la numere int la obiecte: mapToObj transformă fiecare număr într-un obiect, boxed îl împachetează în Integer.