Ruisseaux
Avant Java 8
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
Nous pouvons également utiliser lambda et les streams ( Tutorial ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
Pourquoi forEachOrdered
et non forEach
avec des streams?
Le comportement de forEach
est explicitement non déterministe alors que le forEachOrdered
effectue une action pour chaque élément de ce flux, dans l'ordre de rencontre du flux si le flux a un ordre de rencontre défini. forEach
Ne garantit donc pas que la commande sera conservée.
De plus, lorsque vous travaillez avec des flux (en particulier des flux parallèles), gardez à l'esprit la nature des flux. Selon le doc :
Les résultats du pipeline de flux peuvent être non déterministes ou incorrects si les paramètres de comportement des opérations de flux sont avec état. Un lambda avec état est un dont le résultat dépend de tout état qui pourrait changer pendant l'exécution du pipeline de flux.
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
Ici, si l'opération de mappage est effectuée en parallèle, les résultats pour la même entrée peuvent varier d'une exécution à l'autre, en raison de différences de planification des threads, tandis qu'avec une expression lambda sans état, les résultats seraient toujours les mêmes.
Les effets secondaires des paramètres de comportement pour les opérations de flux sont, en général, découragés, car ils peuvent souvent conduire à des violations involontaires de l'apatridie, ainsi qu'à d'autres dangers liés à la sécurité des threads.
Les flux peuvent avoir ou non un ordre de rencontre défini. Le fait qu'un flux ait ou non un ordre de rencontre dépend de la source et des opérations intermédiaires.