一个'for'循环迭代Java中的枚举

时间:2009-07-09 16:24:03

标签: java enums for-loop

我在Java中有一个enum用于主要&中间方向:

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

如何编写循环遍历每个for值的enum循环?

12 个答案:

答案 0 :(得分:1352)

.values()

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

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

values()方法为implicitly declared by the compiler。所以它没有列在Enum doc上。

答案 1 :(得分:124)

枚举#值():

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

答案 2 :(得分:60)

您可以按照以下方式执行此操作:

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

答案 3 :(得分:39)

Java 8之前

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

Java 8

我们也可以使用lambda和streams(Tutorial):

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

为什么forEachOrdered而不是forEach包含流?

forEach的行为明确是不确定的,因为forEachOrdered对流的每个元素执行操作,如果流具有已定义的遭遇顺序,则按流的遭遇顺序执行操作。所以forEach并不保证订单会被保留。

当处理流(特别是并行流)时,请记住流的本质。根据{{​​3}}:

如果流操作的行为参数是有状态的,则流管道结果可能是不确定的或不正确的。有状态lambda是一个结果,它的结果取决于在流管道执行期间可能发生变化的任何状态。

Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...

这里,如果映射操作是并行执行的,由于线程调度的差异,相同输入的结果可能因运行而异,而对于无状态lambda表达式,结果将始终相同。

通常不鼓励对流操作的行为参数产生副作用,因为它们通常会导致无意中违反无国籍要求以及其他线程安全隐患。

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

答案 4 :(得分:21)

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

}

答案 5 :(得分:19)

如果您不关心订单,这应该有效:

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

答案 6 :(得分:18)

    for (Direction  d : Direction.values()) {
       //your code here   
    }

答案 7 :(得分:5)

Java8

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

来自Java5 +

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

答案 8 :(得分:5)

尝试为每个

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

答案 9 :(得分:4)

java 8中的更多方法:

EnumSetforEach

一起使用
EnumSet.allOf(Direction.class).forEach(...);

Arrays.asListforEach

一起使用
Arrays.asList(Direction.values()).forEach(...);

答案 10 :(得分:1)

values() 方法可能很简单:

for (Direction  d : Direction.values()) {
   //whatever you want to do with each of these enum values  
}

答案 11 :(得分:0)

我们可以像这样使用过滤器(JAVA 8)。

Stream.of(Direction.values()).filter(name -> !name.toString().startsWith("S")).forEach(System.out::println);