Z javadoc pakietu stream
:
W prawie wszystkich przypadkach, operacje terminalowe są chętni, ukończenie ich przechodzenie źródła danych i przetwarzanie rurociągu przed powrocie. Nie działają tylko operacje terminalowe; są one dostarczane jako "luki bezpieczeństwa" w celu umożliwienia dowolnych ruchów rurociągów kontrolowanych przez klienta w przypadku, gdy istniejące operacje nie są wystarczające dla danego zadania.
Oznacza to, że w większości przypadków przejścia strumień jest zakończone, gdy terminal powraca pracy, ale nie w przypadku iterator()
i spliterator()
: przy użyciu jednego z tych operacji terminalowych Iterator
lub Spliterator
jest zwracany, ale potok jest nadal "otwarty" i zostanie przetworzony, ponieważ elementy są wymagane przez iterator. W ten sposób przetwarzanie strumienia staje się leniwe, ponieważ operacje w strumieniu są wykonywane tylko wtedy, gdy żądany jest następny element.
Iterator<Person> iterator = persons
.stream()
.filter(p -> !p.getName().equals("Mike Tyson"))
.iterator();
Po metoda iterator()
nazywa, strumień jest „zakończony”: nie można łańcuch więcej metod. Ale możesz uzyskać dostęp do elementów strumienia, wywołując metodę zwracanego iteratora, a strumień zacznie być przetwarzany tylko za pierwszym razem. Dotyczy to tylko operacji terminalowej iterator()
lub spliterator()
.