Stream.map în Java

Transformă fiecare element al stream-ului în altă valoare, eventual de alt tip.

Sintaxă
<R> Stream<R> map(Function<? super T, ? extends R> transformare)

Ce face Stream.map

map(f) aplică funcția f pe fiecare element și pune rezultatul în noul stream. Numărul de elemente rămâne același; se schimbă doar valorile (și, eventual, tipul): un Stream<String> poate deveni Stream<Integer> cu map(String::length).

Funcția se scrie ca lambda (n -> n * 2) sau ca referință la metodă (String::toUpperCase, Produs::nume). Dacă rezultatul este un număr pe care vrei să-l aduni, mapToInt/mapToDouble îți dau direct sum() și average().

Parametri

Parametru Descriere
transformare Funcția aplicată fiecărui element; ce returnează devine noul element.

Ce returnează

Un Stream<R> cu rezultatele funcției, în aceeași ordine.

Exemple

Exemplul 1: Transformări simple

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> nume = List.of("ana", "mihai", "ioana");

        System.out.println(nume.stream().map(String::toUpperCase).toList());
        System.out.println(nume.stream().map(String::length).toList());
        System.out.println(nume.stream().map(n -> "Dna/Dl " + n).toList());
    }
}

Rezultat

[ANA, MIHAI, IOANA]
[3, 5, 5]
[Dna/Dl ana, Dna/Dl mihai, Dna/Dl ioana]

Exemplul 2: Din obiecte extragi un câmp

import java.util.List;

public class Main {
    record Student(String nume, int nota) {}

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

        List<String> doarNume = grupa.stream().map(Student::nume).toList();
        System.out.println(doarNume);

        grupa.stream()
                .map(s -> s.nume() + ": " + (s.nota() >= 5 ? "promovat" : "restanță"))
                .forEach(System.out::println);
    }
}

Rezultat

[Ana, Radu, Ioana]
Ana: promovat
Radu: promovat
Ioana: promovat

Exemplul 3: Prețuri cu TVA

map se poate înlănțui: întâi calculul, apoi formatarea textului.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Double> preturiFaraTva = List.of(100.0, 45.5, 12.0);
        preturiFaraTva.stream()
                .map(p -> p * 1.21)
                .map(p -> String.format("%.2f lei", p))
                .forEach(System.out::println);
    }
}

Rezultat

121.00 lei
55.06 lei
14.52 lei

Greșeli frecvente

  • Folosești map când funcția returnează o listă sau un stream. Obții un Stream<List<T>>; pentru a „aplatiza” rezultatul folosește flatMap.
  • Pui în map o lambda care modifică obiectele și nu returnează nimic util. map este pentru transformări; pentru efecte (afișare) folosește forEach.

Comenzi înrudite

  • Stream.filter: Păstrează în stream doar elementele care îndeplinesc o condiție.
  • 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().
  • Function: O funcție care primește o valoare de tip T și returnează una de tip R; o apelezi cu apply.
  • Stream.collect: Adună elementele într-un rezultat (listă, set, map, text) folosind un Collector, de obicei din clasa Collectors.