2017-03-01 29 views

Odpowiedz

39

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().