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

Nic*_*yer 854 java enums for-loop

我有一个enumJava用于基数和中间方向:

public enum Direction {
   NORTH,
   NORTHEAST,
   EAST,
   SOUTHEAST,
   SOUTH,
   SOUTHWEST,
   WEST,
   NORTHWEST
}
Run Code Online (Sandbox Code Playgroud)

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

not*_*oop 1377

.values()

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

for (Direction dir : Direction.values()) {
  // do what you want
}
Run Code Online (Sandbox Code Playgroud)

values()方法由编译器隐式声明.所以它没有在Enumdoc上列出.

  • @jacktrades:它是一种只存在于编译器中的隐式方法.因此,基类不能声明具有相同名称的方法,因此它不会包含在自动生成的Javadoc中.http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2 (79认同)
  • 为什么在java.lang.enum下没有列出此方法*values()*[here](http://docs.oracle.com/javase/7/docs/api/) (42认同)
  • 奇怪的是,它在[valueOf()docs]中提到过(http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#valueOf(java.lang.Class,%20java) .lang.String)) (4认同)

dfa*_*dfa 126

枚举值#():

 for (Direction d : Direction.values()) {
     System.out.println(d);
 }
Run Code Online (Sandbox Code Playgroud)

  • @YoTengoUnLCD hashtag是JavaDoc语法,而不是Java代码. (3认同)

tol*_*uju 61

你可以这样做:

for (Direction direction : EnumSet.allOf(Direction.class)) {
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 对Java8 foreach循环非常有用.EnumSet.allOf(Enum.class).forEach(blah - > method(blah)) (8认同)
  • 假设您导入 java.util.EnumSet (2认同)
  • @Jezor当您实际上需要一组非常快速的枚举(例如位标志)时,这是一个更好的选择,尽管对于简单的迭代而言似乎太复杂了。 (2认同)

i_a*_*ero 43

在Java 8之前

for (Direction dir : Direction.values()) {
            System.out.println(dir);
}
Run Code Online (Sandbox Code Playgroud)

Java 8

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

Stream.of(Direction.values()).forEachOrdered(System.out::println);
Run Code Online (Sandbox Code Playgroud)

为什么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; })...
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 与所有流操作一样,请注意线程无状态性和副作用限制https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Stateless。这两个枚举迭代选项在这方面有显着不同。 (2认同)

use*_*884 21

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

}
Run Code Online (Sandbox Code Playgroud)


Tom*_*rys 19

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

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

  • 来自[EnumSet`的文档](https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html):*迭代器方法返回的迭代器遍历其中的元素**自然顺序**(枚举常量声明的顺序)*.这保证了迭代的顺序与`Enum.values()`返回的顺序相匹配. (4认同)
  • 如果导入java.util.EnumSet和java.util.Set (2认同)

akf*_*akf 18

    for (Direction  d : Direction.values()) {
       //your code here   
    }
Run Code Online (Sandbox Code Playgroud)


Rag*_*air 5

Java8的

Stream.of(Direction.values()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

从Java5 +

for ( Direction d: Direction.values()){
 System.out.println(d);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

尝试对每个使用

for ( Direction direction : Direction.values()){
  System.out.println(direction.toString());
}
Run Code Online (Sandbox Code Playgroud)


NiV*_*VeR 5

java 8中的更多方法:

EnumSet与使用forEach

EnumSet.allOf(Direction.class).forEach(...);
Run Code Online (Sandbox Code Playgroud)

Arrays.asList与使用forEach

Arrays.asList(Direction.values()).forEach(...);
Run Code Online (Sandbox Code Playgroud)