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 deIntStream. Nu se compilează; foloseșteIntStream.of,Arrays.stream(int[])saumapToInt.
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(…).