Stream.flatMapToInt în Java

Ca flatMap, dar fiecare element produce un stream de numere primitive, iar rezultatul este un IntStream, LongStream sau DoubleStream.

Sintaxă
IntStream flatMapToInt(Function<? super T, ? extends IntStream> f)
LongStream flatMapToLong(Function<? super T, ? extends LongStream> f)
DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> f)

Ce face Stream.flatMapToInt

flatMapToInt transformă fiecare element într-un IntStream și le lipește pe toate într-un singur IntStream. Variantele flatMapToLong și flatMapToDouble fac același lucru pentru long și double.

Folosește-le când fiecare obiect are mai multe numere (notele unui student, cheltuielile unei luni) și vrei să le aduni sau să le faci media direct, fără Integer/Double intermediare.

Parametri

Parametru Descriere
f Funcția care primește un element și returnează un stream de numere primitive.

Ce returnează

Un IntStream, LongStream sau DoubleStream cu toate numerele produse.

Exemple

Exemplul 1: Media tuturor notelor din grupă

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

public class Main {
    record Student(String nume, int[] note) {}

    public static void main(String[] args) {
        List<Student> grupa = List.of(
                new Student("Ana", new int[] {9, 10, 8}),
                new Student("Radu", new int[] {6, 7}),
                new Student("Ioana", new int[] {10, 10, 9, 9}));

        double media = grupa.stream()
                .flatMapToInt(s -> Arrays.stream(s.note()))
                .average()
                .orElse(0);
        System.out.printf("Media grupei: %.2f%n", media);
    }
}

Rezultat

Media grupei: 8.67

Exemplul 2: Cheltuieli zilnice în double și durate în long

import java.util.List;
import java.util.stream.DoubleStream;
import java.util.stream.LongStream;

public class Main {
    public static void main(String[] args) {
        List<double[]> saptamani = List.of(
                new double[] {25.5, 40.0, 12.3},
                new double[] {80.0, 15.7});
        double total = saptamani.stream().flatMapToDouble(DoubleStream::of).sum();
        System.out.printf("Cheltuieli: %.2f lei%n", total);

        List<String> zile = List.of("luni", "marți");
        long secunde = zile.stream()
                .flatMapToLong(z -> LongStream.of(3_600L, 7_200L))
                .sum();
        System.out.println("Secunde lucrate: " + secunde);
    }
}

Rezultat

Cheltuieli: 173.50 lei
Secunde lucrate: 21600

Exemplul 3: Toate caracterele dintr-o listă de cuvinte

String.chars() returnează un IntStream cu codurile caracterelor.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> cuvinte = List.of("mere", "pere", "prune");
        long vocale = cuvinte.stream()
                .flatMapToInt(String::chars)
                .filter(c -> "aeiou".indexOf(c) >= 0)
                .count();
        System.out.println("Vocale: " + vocale);
    }
}

Rezultat

Vocale: 6

Greșeli frecvente

  • Funcția returnează un Stream<Integer> în loc de IntStream. Nu se compilează; folosește IntStream.of, Arrays.stream(int[]) sau mapToInt.

Comenzi înrudite

  • Stream.flatMap: Transformă fiecare element într-un stream și lipește toate aceste stream-uri într-unul singur.
  • Stream.mapToInt: Transformă elementele în numere primitive (int, long, double) și dă acces la sum(), average(), max().
  • IntStream: Un stream de numere int simple, cu sum, average, min, max; IntStream.of îl creează direct din valori.
  • Stream.mapMulti: Pentru fiecare element trimiți zero, una sau mai multe valori mai departe, apelând consumer.accept(…).