Lecții din modul (2/2)
API Stream
Stream API în Java vă permite să procesați colecții de obiecte într-un mod declarativ, valorificând programarea funcțională. Un flux nu stochează date, ci transportă elemente dintr-o sursă (cum ar fi o listă sau o matrice) printr-o serie de operațiuni.
O conductă Stream este formată din trei părți:
- O sursă (de exemplu,
list.stream()) - Zero sau mai multe operațiuni intermediare (care returnează un flux nou, de exemplu,
filter,map) - O operație terminală (care produce un rezultat final sau un efect secundar și închide fluxul, de exemplu,
collect,forEach,reduce)
Operațiuni intermediare comune
Operațiile intermediare sunt leneșe: nu sunt executate până când nu este invocată o operație de terminal.
filter(Predicate): filtrează elementele pe baza unei condiții booleene.map(Function): transformă fiecare element într-un alt obiect prin aplicarea unei funcții.sorted(): sortează elementele fluxului.
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
.filter(name -> name.startsWith("M"))
.map(name -> name.toUpperCase())
.collect(Collectors.toList()); // "MARCO"Operațiuni comune ale terminalelor
forEach(Consumer): efectuează o acțiune pentru fiecare element al fluxului.collect(Collector): adună rezultatele fluxului într-un container (de exemplu, o listă folosindCollectors.toList()).reduce(identity, BinaryOperator): combină elementele Stream într-o singură valoare cumulativă.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10Încercați-l singur
Completați codul utilizând fluxul de numere pentru a filtra numai numerele pare, colectați-le într-o nouă listă numită evens și tipăriți-l folosind System.out.println.
Afișează indiciu
Începeți prin a apela `numbers.stream()`, adăugați `.filter(n -> n % 2 == 0)` și, în final, colectați cu `.collect(Collectors.toList())`.
Soluție disponibilă după 3 încercări
Utilizați fluxuri pentru a transforma toate numele din lista de nume în majuscule folosind harta și imprimați-le unul câte unul folosind forEach cu o referință de metodă.
Afișează indiciu
Folosiți `.map(s -> s.toUpperCase())` urmat de operația de terminal `.forEach(System.out::println)`.
Soluție disponibilă după 3 încercări
Completați codul calculând suma tuturor numerelor din lista de numere folosind un Stream și operația de reducere a terminalului cu o valoare inițială de 0. Imprimați suma.
Afișează indiciu
Folosiți `numbers.stream().reduce(0, (a, b) -> a + b)` și imprimați variabila rezultată.
Soluție disponibilă după 3 încercări