Dzisiaj pokażę Ci jak "stream" w języku Java może na Tobie zrobić wrażenie pod kątem przyjemniejszego pisania kodu. Java, poza podejściem obiektowym, wspiera także paradygmat funkcyjny i ten "cosik" jaki mam zamiar Ci przekazać, otwiera drogę do programowania funkcyjnie 🎉. Zapraszam do środka!
"STREAM" W JĘZYKU JAVA DROGĄ DO PODEJŚCIA FUNKCYJNEGO
Dotkniemy programowania funkcyjnego, które w dużym skrócie polega na operowaniu na ciągach wywołań funkcji zwracających wartości (tzw. funkcje wyższego rzędu) bez przechowywania rezultatów na uboczu. Tu chodzi o to, żeby wywołać jakiś jednowierszowy ciąg zdarzeń na tej samej kolekcji (czasami na kilku różnych kolekcjach), otrzymać wynik, ewentualnie tylko jego przechować w zmiennej i dalej operować w taki sam sposób bezpośrednio na nim 🔨.
Metoda "stream" w języku Java wywoływana jest z poziomu kolekcji tj. zbioru danych o dynamicznie zmieniającym się rozmiarze (podczas działania programu). Konwertuje ona postać "tradycyjną" na sekwencyjną (sprzyjającą iterowaniu), czyli na strumień. To oznacza, że będzie można zastosować na nim różne inne metody obsługujące elementy kolekcji ✅.
Tu dotykamy innego pojęcia: "funkcje wyższego rzędu". Zasadą ich funkcjonowania jest zwracanie nowej kolekcji z wykluczeniem elementów spełniających określony warunek zawarty w wyrażeniu lambda (tzw. "predykat"). Obejmuje to najczęściej filtrowanie np. zwróć kolekcję wyłącznie z parzystymi liczbami całkowitymi (x % 2 == 0), przy czym to nie jest jedyny sposób ich użycia ℹ️. Na oba zagadnienia poświęcone będą osobne artykuły, więc na tym zakończę o nich pisanie.
Przykład kodu źródłowego
Tu skoncentrujemy się na samej metodzie "stream". Podstawowa rzecz to zaopatrzyć się w jakąś kolekcję. Dajmy na to, "ArrayList" z liczbami całkowitymi 🔢:
var numbers = new ArrayList<>(Arrays.asList(10, 12, 15, 23, 41));Od tej pory, możemy wywoływać "stream":
numbers.stream();Weźmy pod lupę zawartość naszego strumienia:
var numbersStream = numbers.stream();
numbersStream.forEach(System.out::println);Jedno zdanie wyjaśnienia: "var" to słowo kluczowe, które pozwala Tobie uniknąć każdorazowego wpisywania typu danych u zmiennej ℹ️. Więcej informacji kiedy i w jaki sposób można stosować, znajduje się w dołączonym artykule.
Wracając. Gdy przeiterujemy nasz strumień, to mamy tę samą sekwencję i te same elementy 👍. Czyli tak jak napisałem - to niejako nam konwertuje kolekcję na sekwencję, po której możemy "chodzić" element po elemencie 🥾.
"forEach" pozwala nam iterować w taki sam sposób, jak przy pomocy pętli rozszerzonej, tylko jeszcze bardziej zwięźle 🙂. Zapis wykorzystuje referencję do metody, gdyby się ktoś zastanawiał co to za zapis 🙃…
Dodam od siebie jedno. Jeżeli chcesz się wyróżnić wśród innych kandydatów aplikujących do pracy, oto argumenty na pytanie dlaczego naprawdę warto znać funkcyjne podejście do obsługi kolekcji. Nie tylko sprawia, że kod jest bardziej zwięzły, lecz wygląda o wiele bardziej profesjonalnie, niż tworzenie nowej instancji, przechodzenie przez pętlę "for", sprawdzanie czy warunek jest spełniony i dodawanie elementu ręcznie. Zobacz, nawet samo pisanie o tym jest dłuższe 😅!
![]() |
Metoda "stream" w języku Java polega na konwersji kolekcji na postać sekwencyjną umożliwiającą przeprowadzanie operacji zgodnie z podejściem funkcyjnym.
Nic więcej na ten temat nie trzeba wiedzieć ani pisać, więc tyle z mojej strony 😉!
NASTĘPNY ARTYKUŁ: filter w języku Java. Filtrowanie kolekcji według kryteriów
