Java. Pytania rekrutacyjne dla Juniora: Czy streamy (strumienie) są lazy i co to znaczy?

Kontynuując serię pytań o strumieniach, warto rozwinąć kwestię czasu, w którym wykonują się operacje pośrednie. 

Operacje pośrednie w strumieniu są lazy

Operacje pośrednie są lazy, czyli mają wartościowanie leniwe. Mianowicie każda pośrednia operacja nie jest wykonywana dopóki nie zostanie wywołana operacja końcowa. Operacje pośrednie dostarczają jedynie nowe strumienie. Jak już wspomniałem we wcześniejszym wpisie nie jest wymagane użycie jakiejkolwiek operacji końcowej, tak więc zadeklarowane operacje pośrednie mogą w ogóle nie zostać wykonane. Sprawdźmy to na poniższym przykładzie:

Stream<Integer> intStream = IntStream.iterate(0, x -> x + 1)
          .limit(5)
          .boxed()
          .peek(System.out::println);
System.out.println("test"); 

Jak myślicie, co wyświetli się w konsoli? Tylko "test". Bowiem w kodzie nie ma żadnej metody końcowej, więc zgodnie z wartościowaniem leniwym wynik operacji pośrednich nie musi być dostarczony. Gdy dodamy metodę końcową np. count() zwróćcie uwagę w jakiej kolejności wyświetlą się w konsoli poszczególne elementy.

Stream<Integer> intStream = IntStream.iterate(0, x -> x + 1)
          .limit(5)
          .boxed()
          .peek(System.out::println);

System.out.println("test");
long countIntStream = intStream.count();
System.out.println("count: " + countIntStream);

Konsola wyświetli:

test
0
1
2
3
4
count: 5

Więc strumień zaczął się wykonywać dopiero po użyciu operacji końcowej count().

Pozostaje jeszcze odpowiedź z poprzedniego wpisu, odnośnie możliwości użycia dwóch operacji końcowych.

Nie można ich użyć, gdyż nie można dwa razy wykorzystać tego samego rurociągu, czyli pipeline, do wykonania operacji końcowej. Każda operacja końcowa zmienia stan pipeline na zużyty (linkedOrConsumed), a kolejna próba wykonania operacji końcowej wyrzuca wyjątek IllegalStateException.

Jeżeli macie uwagi bądź pytania, piszcie w komentarzach.

PS. Staram się używać zamiennie polskich i oryginalnych nazw. W programowaniu angielski jest podstawowym językiem i często w ogóle nie używa się polskich określeń. Czasem polskie nazwy potrafią wręcz wprawić w zakłopotanie, jednak spotykam się z nimi w literaturze czy na innych blogach, więc taka zamienność nazw mam nadzieję, że będzie jedynie pomocna dla osób zaczynających programować.

Java. Pytania rekrutacyjne dla Juniora: Czy streamy (strumienie) są lazy i co to znaczy?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Przewiń do góry