Streams
Antes do Java 8
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
Também podemos usar lambda e streams ( Tutorial ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
Por que forEachOrdered
e não forEach
com fluxos?
O comportamento de forEach
é explicitamente não determinístico, onde comoforEachOrdered
executa uma ação para cada elemento desse fluxo, na ordem de encontro do fluxo, se o fluxo tiver uma ordem de encontro definida. assimforEach
, não garante que o pedido seja mantido.
Além disso, ao trabalhar com fluxos (especialmente os paralelos), lembre-se da natureza dos fluxos. De acordo com o documento :
Os resultados do pipeline de fluxo podem não ser determinísticos ou incorretos se os parâmetros comportamentais para as operações de fluxo forem stateful. Um lambda com estado é aquele cujo resultado depende de qualquer estado que possa mudar durante a execução do pipeline de fluxo.
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
Aqui, se a operação de mapeamento for executada em paralelo, os resultados para a mesma entrada podem variar de execução para execução, devido a diferenças de planejamento de encadeamento, enquanto que, com uma expressão lambda sem estado, os resultados sempre serão os mesmos.
Os efeitos colaterais nos parâmetros comportamentais das operações de fluxo são, em geral, desencorajados, pois geralmente podem levar a violações involuntárias do requisito de apatridia, bem como a outros riscos de segurança da thread.
Os fluxos podem ou não ter uma ordem de encontro definida. O fato de um fluxo ter ou não uma ordem de encontro depende da origem e das operações intermediárias.