用于遍历 Java 枚举的 “for” 循环

public enum Direction {
   NORTH,
   NORTHEAST,
   EAST,
   SOUTHEAST,
   SOUTH,
   SOUTHWEST,
   WEST,
   NORTHWEST
}

答案

.values()

您可以在枚举上调用values()方法。

for (Direction dir : Direction.values()) {
  // do what you want
}

values()方法由编译器隐式声明 。因此它未在Enum文档上列出。

可以通过调用该类型的隐式public static T[] values()方法来获取枚举类型的所有常量:

for (Direction d : Direction.values()) {
     System.out.println(d);
 }

您可以按照以下步骤进行操作:

for (Direction direction : EnumSet.allOf(Direction.class)) {
  // do stuff
}

Java 8 之前的版本

for (Direction dir : Direction.values()) {
            System.out.println(dir);
}

Java 8

我们还可以使用 lambda 和 streams( 教程 ):

Stream.of(Direction.values()).forEachOrdered(System.out::println);

为什么使用流而不forEach forEachOrdered

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 表达式时,结果将始终相同。

通常,不鼓励在行为参数上进行流操作的副作用,因为它们通常会导致无意识地违反无状态要求以及其他线程安全危害。

流可能具有也可能没有定义的遇到顺序。流是否具有遇到顺序取决于源和中间操作。

for(Direction dir : Direction.values())
{

}

如果您不关心订单,那么应该可以:

Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
    // do stuff
}
for (Direction  d : Direction.values()) {
       //your code here   
    }

Java8 的

Stream.of(Direction.values()).forEach(System.out::println);

从 Java5 +

for ( Direction d: Direction.values()){
 System.out.println(d);
}

尝试对每个使用

for ( Direction direction : Direction.values()){
  System.out.println(direction.toString());
}

Java 8 中的更多方法:

EnumSetforEach一起forEach

EnumSet.allOf(Direction.class).forEach(...);

Arrays.asListforEach一起forEach

Arrays.asList(Direction.values()).forEach(...);