Java Language Catégories d'opérations de flux


Exemple

Les opérations de flux se répartissent en deux catégories principales, les opérations intermédiaires et terminales, et deux sous-catégories, sans état et avec état.


Opérations intermédiaires:

Une opération intermédiaire est toujours paresseuse , telle qu'une simple Stream.map . Il n'est pas appelé tant que le flux n'est pas réellement consommé. Cela peut être vérifié facilement:

Arrays.asList(1, 2 ,3).stream().map(i -> {
    throw new RuntimeException("not gonna happen");
    return i;
});

Les opérations intermédiaires sont les blocs de construction communs d'un flux, chaînés après la source et sont généralement suivis d'une opération de terminal déclenchant la chaîne de flux.


Opérations Terminal

Les opérations terminales sont ce qui déclenche la consommation d'un flux. Les plus courants sont Stream.forEach ou Stream.collect . Ils sont généralement placés après une chaîne d'opérations intermédiaires et sont presque toujours impatients .


Opérations apatrides

L'apatridie signifie que chaque élément est traité sans le contexte des autres éléments. Les opérations sans état permettent un traitement efficace des flux dans la mémoire. Les opérations telles que Stream.map et Stream.filter ne nécessitant pas d'informations sur d'autres éléments du flux sont considérées comme étant sans état.


Opérations avec état

Statefulness signifie que l'opération sur chaque élément dépend de (certains) autres éléments du flux. Cela nécessite un état à préserver. Les opérations d'état peuvent se rompre avec des flux longs ou infinis. Les opérations telles que Stream.sorted requièrent que l'intégralité du flux soit traitée avant que tout élément ne soit émis, ce qui entraînera un flux d'éléments suffisamment long. Cela peut être démontré par un long flux ( exécuté à vos risques et périls ):

// works - stateless stream
long BIG_ENOUGH_NUMBER = 999999999;
IntStream.iterate(0, i -> i + 1).limit(BIG_ENOUGH_NUMBER).forEach(System.out::println);

Cela provoquera un manque de mémoire dû à l'état de Stream.sorted :

// Out of memory - stateful stream
IntStream.iterate(0, i -> i + 1).limit(BIG_ENOUGH_NUMBER).sorted().forEach(System.out::println);