Zielony Smok - logo witryny

Strumienie elementów

Java 8 wprowadza pojęcie strumieni elementów, podobnych do iteratorów w kolekcjach. Strumieniami są obiekty klas implementujących interfejs java.util.stream.Stream lub jeden z interfejsów pochodnych, wyspecjalizowanych do wykonywania operacji na kolekcjach lub tablicach typów prymitywnych: int, long i double. Strumienie w połączeniu z wyrażeniami lambda pozwalają na wykonywanie operacji na kolekcjach lub tablicach elementów. My dla odróżnienia ich od dotychczasowych strumieni nazwaliśmy je, na potrzeby tej publikacji, strumieniami elementów.

Strumień elementów zawiera zestaw danych pochodzących z kolekcji. Dane z kolekcji przetwarzane są potokowo. Najpierw wykonywane są tzw. operacje pośrednie (wyszczególnione poniżej), a następnie operacje końcowe (kończące) – również wyszczególnione poniżej. Strumienie elementów nie przechowują danych ani ich kopii, a jedynie przekazują je dalej po wykonaniu niezbędnych operacji.

Tab. Najważniejsze operacje pośrednie
Operacja Opis
filter Filtruje strumień elementów i przekazuje dalej jedynie te
dane, które spełniają określony warunek (warunki)
distinct Cedzi strumień elementów przekazując dalej jedynie nie
powtarzające się wartości
map Mapuje elementy strumienia i przekazuje dalej zmapowane
elementy
sorted Przekazuje dalej strumień elementów, w którym elementy
strumienia elementów są posortowane w określony sposób

W wyniku każdej z powyższych operacji powstaje nowy strumień elementów. Operacje te są określane terminem lazy
(leniwe), gdyż operacje te są wykonywane dopiero wtedy, gdy zostanie określona (wywołana) operacja kończąca.

Tab. Najważniejsze operacje kończące
Operacja Opis
Operacje iterujące
forEach Przetwarza każdy element strumienia elementów.
Operacje redukujące
average Oblicza średnią elementów ze strumienia elementów
count Zlicza elementy
max Wybiera element największy
min Wybiera element najmniejszy
reduce Redukuje elementy kolekcji do pojedynczej wartości (np.
dodaje dwa elementy)
Operacje zwracające kontener elementów
collect Zwraca nową kolekcję zawierającą elementy, po wykonaniu na
nich operacji pośrednich
toArray Zwraca nową tablicę zawierającą elementy, po wykonaniu na
nich operacji pośrednich
Operacje wyszukujące elementy –
zwracają
true lub false
findFirst Znajduje pierwszy element strumienia elementów
findAny Znajduje jakikolwiek element strumienia elementów
anyMatch Sprawdza, czy którykolwiek element strumienia spełnia
zadany warunek
allMatch Sprawdza, czy każdy z elementów spełnia podany warunek

Powyższe operacje kończące są określane słowem eager (gorliwy), gdyż wykonują swoje zadania natychmiast po ich wywołaniu. Np. findFirst zaczyna pracę natychmiast po wywołaniu i kończy ją natychmiast po znalezieniu pierwszego elementu wykonującego podany warunek.

W następnym wpisie omówię szczegółowo strumienie intów.