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.