我在Java中有一个用于基数和中间方向的枚举:

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

我怎么能写一个循环,遍历每一个这些枚举值?


当前回答

Java 8之前

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

Java 8

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

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

为什么在流中forEachOrdered而不是forEach ?

forEach的行为是显式的不确定的,其中forEachOrdered为流的每个元素执行一个操作,如果流具有定义的遇到顺序,则按照流的遇到顺序执行。因此forEach并不保证顺序会被保持。

另外,当使用流(尤其是并行流)时,请记住流的性质。根据文件:

如果流操作的行为参数是有状态的,则流管道结果可能是不确定的或不正确的。有状态lambda的结果取决于流管道执行过程中可能改变的任何状态。

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

在这里,如果映射操作是并行执行的,由于线程调度的差异,同一输入的结果在不同的运行中可能会有所不同,而使用无状态lambda表达式,结果总是相同的。

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

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

其他回答

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

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

枚举类型的所有常量都可以通过调用该类型的隐式公共静态T[] values()方法来获得:

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

. values ()

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

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

这个values()方法由编译器隐式声明。所以它没有列在Enum文档中。

如果你不关心顺序,这应该工作:

Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
    // 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);

为什么在流中forEachOrdered而不是forEach ?

forEach的行为是显式的不确定的,其中forEachOrdered为流的每个元素执行一个操作,如果流具有定义的遇到顺序,则按照流的遇到顺序执行。因此forEach并不保证顺序会被保持。

另外,当使用流(尤其是并行流)时,请记住流的性质。根据文件:

如果流操作的行为参数是有状态的,则流管道结果可能是不确定的或不正确的。有状态lambda的结果取决于流管道执行过程中可能改变的任何状态。

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

在这里,如果映射操作是并行执行的,由于线程调度的差异,同一输入的结果在不同的运行中可能会有所不同,而使用无状态lambda表达式,结果总是相同的。

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

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