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