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:
- Źródła (np.
list.stream()) - Zera lub większej liczby operacji pośrednich (które zwracają nowy Stream, np.
filter,map) - 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.
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ą.
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
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.
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
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.
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
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.
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