流
Java 8 之前
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
我们还可以使用 lambda 和流 (Tutorial):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
为什么 forEachOrdered 而不是 forEach 带有流?
forEach 的行为是明确的不确定性,因为forEachOrdered 对该流的每个元素执行一个操作,如果流具有定义的遇到顺序,则按照流的遇到顺序。所以forEach 不保证订单会被保留。
此外,在使用流(尤其是并行流)时,请记住流的性质。根据doc:
如果流操作的行为参数是有状态的,则流管道结果可能是不确定的或不正确的。有状态 lambda 的结果取决于在流管道执行期间可能发生变化的任何状态。
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
在这里,如果映射操作是并行执行的,由于线程调度的差异,相同输入的结果可能会因运行不同而不同,而对于无状态 lambda 表达式,结果将始终相同。
通常不鼓励对流操作的行为参数产生副作用,因为它们通常会导致无意中违反无状态要求以及其他线程安全隐患。
流可能有也可能没有定义的相遇顺序。流是否有遇到顺序取决于源和中间操作。