À partir de la javadoc de l' stream
paquet de:
Dans presque tous les cas, les opérations de terminal sont désireux, à remplir leurs
la traversée de la source de données et le traitement de la canalisation avant
retour. Seules les opérations de terminal iterator()
et spliterator()
sont pas; elles sont fournies comme un "sas de secours" afin de permettre à l'arbitraire
contrôlée par le client pipeline traversals dans le cas où l'existant
les opérations ne suffisent pas à la tâche.
Ce qui signifie que dans la plupart des cas, le flux de la traversée à l'est terminée quand un terminal opération retourne, mais pas dans le cas d' iterator()
et spliterator()
: en utilisant l'une de ces opérations de terminal un Iterator
ou Spliterator
est retourné, mais le pipeline est toujours "ouvert" et il sera traité comme les éléments sont demandés par l'itérateur. De cette façon, le traitement de flux devient paresseux, parce que les opérations sur le stream n'est effectuée que si l'élément suivant est demandé.
Iterator<Person> iterator = persons
.stream()
.filter(p -> !p.getName().equals("Mike Tyson"))
.iterator();
Après l' iterator()
méthode est appelée, le flux est "terminé": vous ne pouvez pas la chaîne de plusieurs méthodes. Mais vous pouvez accéder aux éléments du cours d'eau par l'appel de la next()
méthode de l'itérateur renvoyé et le cours d'eau va commencer à être traitées uniquement la première fois que vous le faites. Et c'est vrai que si l' iterator()
ouspliterator()
d'exploitation du terminal est utilisé.