Ce face Stream.mapToInt
mapToInt, mapToLong și mapToDouble funcționează ca map, dar rezultatul este un stream de numere primitive: IntStream, LongStream sau DoubleStream. Acestea au metode de calcul pe care Stream<Integer> nu le are: sum(), average(), summaryStatistics().
Numerele primitive nu sunt împachetate în obiecte (Integer, Double), deci calculele pe multe valori sunt mai rapide. Pentru a reveni la un stream de obiecte folosești boxed() sau mapToObj.
Parametri
| Parametru | Descriere |
|---|---|
f |
Funcția care transformă un element într-un int, long sau double. |
Ce returnează
Un IntStream, LongStream sau DoubleStream.
Exemple
Exemplul 1: Totalul unui coș de cumpărături
import java.util.List;
public class Main {
record Produs(String nume, double pret, int bucati) {}
public static void main(String[] args) {
List<Produs> cos = List.of(
new Produs("Pâine", 5.5, 2),
new Produs("Lapte", 8.9, 3),
new Produs("Brânză", 32.0, 1));
double total = cos.stream().mapToDouble(p -> p.pret() * p.bucati()).sum();
int bucati = cos.stream().mapToInt(Produs::bucati).sum();
System.out.printf("Total: %.2f lei pentru %d bucăți%n", total, bucati);
}
}
Rezultat
Total: 69.70 lei pentru 6 bucăți
Exemplul 2: Media lungimilor și cel mai lung nume
average() și max() returnează OptionalDouble/OptionalInt, pentru că stream-ul ar putea fi gol.
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> orase = List.of("Iași", "Cluj-Napoca", "Arad", "Constanța");
double media = orase.stream().mapToInt(String::length).average().orElse(0);
int maxim = orase.stream().mapToInt(String::length).max().orElse(0);
System.out.println("Lungime medie: " + media);
System.out.println("Cea mai mare lungime: " + maxim);
}
}
Rezultat
Lungime medie: 7.0
Cea mai mare lungime: 11
Exemplul 3: mapToLong pentru sume mari
Populațiile adunate depășesc limita lui int (circa 2,1 miliarde) doar la valori foarte mari, dar long este alegerea sigură pentru totaluri.
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Long> populatie = Map.of("București", 1_716_000L, "Cluj", 286_000L, "Iași", 271_000L);
long total = populatie.values().stream().mapToLong(Long::longValue).sum();
System.out.println("Total locuitori: " + total);
}
}
Rezultat
Total locuitori: 2273000
Greșeli frecvente
- Folosești
map(x -> x.pret())și apoi cauțisum(). UnStream<Double>nu aresum(); ai nevoie demapToDouble. - Apelezi
getAsDouble()pe rezultatul luiaverage()fără să verifici că stream-ul nu este gol. Pentru un stream gol primeștiNoSuchElementException; foloseșteorElse(0).
Comenzi înrudite
Stream.map: Transformă fiecare element al stream-ului în altă valoare, eventual de alt tip.IntStream: Un stream de numere int simple, cu sum, average, min, max; IntStream.of îl creează direct din valori.IntStream.sum: sum adună numerele din IntStream; average dă media lor ca OptionalDouble (gol dacă nu există numere).IntStream.mapToObj: Trece de la numere int la obiecte: mapToObj transformă fiecare număr într-un obiect, boxed îl împachetează în Integer.IntStream.summaryStatistics: Calculează într-o singură trecere numărul, suma, minimul, maximul și media numerelor din IntStream.