Stream.mapToInt în Java

Transformă elementele în numere primitive (int, long, double) și dă acces la sum(), average(), max().

Sintaxă
IntStream mapToInt(ToIntFunction<? super T> f)
LongStream mapToLong(ToLongFunction<? super T> f)
DoubleStream mapToDouble(ToDoubleFunction<? super T> f)

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ți sum(). Un Stream<Double> nu are sum(); ai nevoie de mapToDouble.
  • Apelezi getAsDouble() pe rezultatul lui average() fără să verifici că stream-ul nu este gol. Pentru un stream gol primești NoSuchElementException; folosește orElse(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.