Przejdź do głównej treści
eLearner.app
Moduł 7 · Lekcja 2 z 214/14 w kursie~15 min
Lekcje modułu (2/2)

Stream API

Interfejs Stream API w Javie pozwala na deklaratywne przetwarzanie kolekcji obiektów, wykorzystując zalety programowania funkcjonalnego. Strumień (Stream) nie przechowuje danych, lecz przesyła elementy ze źródła (takiego jak lista lub tablica) przez potok (pipeline) operacji.

Potok strumienia składa się z trzech części:

  1. Źródła (np. list.stream())
  2. Zera lub większej liczby operacji pośrednich (które zwracają nowy Stream, np. filter, map)
  3. Operacji kończącej (która produkuje ostateczny wynik lub efekt uboczny i zamyka Stream, np. collect, forEach, reduce)

Często używane operacje pośrednie

Operacje pośrednie są leniwe ("lazy"): nie są wykonywane, dopóki nie zostanie wywołana operacja kończąca.

  • filter(Predicate): filtruje elementy na podstawie warunku logicznego.
  • map(Function): przekształca każdy element w inny obiekt poprzez zastosowanie funkcji.
  • sorted(): sortuje elementy strumienia.
Code
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"

Często używane operacje kończące

  • forEach(Consumer): wykonuje akcję dla każdego elementu strumienia.
  • collect(Collector): zbiera wyniki strumienia do kontenera (np. listy za pomocą Collectors.toList()).
  • reduce(identity, BinaryOperator): łączy elementy strumienia w jedną wartość skumulowaną.
Code
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
                 .reduce(0, (a, b) -> a + b); // Somma tutti i numeri: 10

Spróbuj sam

Ćwiczenie#java.m7.l2.e1
Próby: 0Ładowanie...

Uzupełnij kod, używając strumienia zasobów do przefiltrowania tylko liczb parzystych, zebrania ich do nowej List o nazwie evens i wypisania jej za pomocą System.out.println.

Ładowanie edytora...
Pokaż wskazówkę

Zacznij od wywołania `numbers.stream()`, dodaj `.filter(n -> n % 2 == 0)`, a na koniec zbierz za pomocą `.collect(Collectors.toList())`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#java.m7.l2.e2
Próby: 0Ładowanie...

Użyj strumieni, aby przekształcić wszystkie imiona z listy names na wielkie litery za pomocą map, a następnie wypisz je na ekranie jedno po drugim za pomocą foreach z System.lineSeparator lub referencją do metody.

Ładowanie edytora...
Pokaż wskazówkę

Użyj `.map(s -> s.toUpperCase())` a następnie operacji kończącej `.forEach(System.out::println)`.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#java.m7.l2.e3
Próby: 0Ładowanie...

Uzupełnij kod, obliczając sumę wszystkich liczb znajdujących się na liście numbers za pomocą strumienia i operacji kończącej reduce z wartością początkową 0. Wypisz wynik.

Ładowanie edytora...
Pokaż wskazówkę

Użyj `numbers.stream().reduce(0, (a, b) -> a + b)` i wypisz zmienną zawierającą wynik.

Rozwiązanie dostępne po 3 próbach