Answers:
.values()
您可以values()
在枚举上调用该方法。
for (Direction dir : Direction.values()) {
// do what you want
}
可以通过调用该public static T[] values()
类型的隐式方法来获取枚举类型的所有常量:
for (Direction d : Direction.values()) {
System.out.println(d);
}
#
办?
Enum#values()
=Enum.values()
.
(总是吗?)相同吗?
您可以按照以下步骤进行操作:
for (Direction direction : EnumSet.allOf(Direction.class)) {
// do stuff
}
Arrays.stream(Enum.values()).forEach(...)
-流将是连续的
set
不是array
。尽管我认为它更好地描述了枚举值,但它不是“更好”的,因为从集合的定义来看,集合中的值不能重复(例如枚举中的值),而数组中的值可以重复。
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
我们还可以使用lambda和流(Tutorial):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
为什么forEachOrdered
不forEach
使用流?
的行为forEach
是明确不确定的,其中,forEachOrdered
如果流具有已定义的遇到顺序,则在执行此流的每个元素的操作时,将按流的遇到顺序对其进行操作。因此forEach
,不能保证将保留订单。
同样,在使用流(尤其是并行流)时,请记住流的性质。根据文档:
如果流操作的行为参数是有状态的,则流管道结果可能不确定或不正确。有状态lambda是一种有状态的lambda,其结果取决于在流管道执行期间可能更改的任何状态。
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
在这里,如果并行执行映射操作,则由于线程调度差异,同一输入的结果可能因运行而异,而使用无状态lambda表达式时,结果将始终相同。
通常,不要鼓励行为参数对流操作的副作用,因为它们经常会导致无意识地违反无状态要求以及其他线程安全危害。
流可能具有也可能没有定义的遇到顺序。流是否具有遇到顺序取决于源和中间操作。
如果您不关心订单,那么应该可以:
Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
// do stuff
}
EnumSet
:iterator方法返回的迭代器以其自然顺序(声明枚举常量的顺序)遍历元素。这样可以确保迭代顺序与所返回的顺序相匹配Enum.values()
。
Java8的
Stream.of(Direction.values()).forEach(System.out::println);
从Java5 +
for ( Direction d: Direction.values()){
System.out.println(d);
}