我在Java中有一个enum
用于主要&中间方向:
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
如何编写循环遍历每个for
值的enum
循环?
答案 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)
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
我们也可以使用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)
尝试为每个
使用afor ( Direction direction : Direction.values()){
System.out.println(direction.toString());
}
答案 9 :(得分:4)
java 8中的更多方法:
EnumSet
与forEach
EnumSet.allOf(Direction.class).forEach(...);
Arrays.asList
与forEach
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);