A 'for' loop to iterate over an enum in Java
我在Java中有一个EDCOX1,0,用于基本方向和中间方向:
1 2 3 4 5 6 7 8 9 10
| public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
} |
我如何编写一个循环来遍历这些enum值?
- Java 8:StAccOfFult.COM/A/30962181/1216775
.values()
你可以叫EDOCX1。
ZZU1
该方法由编译器默示宣布。因此,它没有在Enum上列出。
- 为什么在java.lang.enum下没有列出此方法的values()。
- @jacktrades:它是一个只存在于编译器中的隐式方法。因此,基类不能声明具有相同名称的方法,因此它不会包含在自动生成的javadocs中。docs.oracle.com/javase/specs/jls/se7/html/jls-8.html_jls-8.9‌&8203;.2
- 奇怪的是,它在valueof()文档中提到
Enum 355;values():
1 2 3
| for (Direction d : Direction. values()) {
System. out. println(d );
} |
- @Randers00正确。但答案仍然有效,而且格式真的不重要(至少对我来说)
- #是做什么的?
- @yotengounlcd基本上是说values()是枚举对象的一部分。例如:Enum#values()=Enum.values()。
- 嗯,对不起,我不明白,这和使用.相同吗??
- @ YoTengoUnLCD Hash标签是JavaDoc语法,不是Java代码。
你可以这样做:
1 2 3
| for (Direction direction : EnumSet.allOf(Direction.class)) {
// do stuff
} |
- 如果导入java.util.enumset
- 对java8 foreach循环非常有用。enumset.allof(enum.class).foreach(blah->method(blah))。
- @hiro2k你也可以做Arrays.stream(Enum.values()).forEach(...)-流将是连续的
- 你能解释一下为什么它比Enum.values()好吗?
- @Schatten好吧,它是一个set,而不是array。它不是"更好",尽管在我看来它更好地描述了枚举值,因为从集合的定义来看,集合中的值不能重复(就像在枚举中一样),而数组中的值可以重复。
- @当您实际需要一组非常快的枚举(比如位标记)时,Jezor是一个更好的选择,尽管对于一个简单的迭代来说似乎太复杂了。
流Prior to Java 8
1 2 3
| for (Direction dir : Direction. values()) {
System. out. println(dir );
} |
爪哇8
我们还可以利用Lambda和Streams(教学):
1
| Stream. of(Direction. values()). forEachOrdered(System. out::println ); |
为什么流浪的人没有爱德华?
明确无误地指出,如果流水有一个明确的油墨顺序,则为这条流的每一个元素在河口的油墨顺序中采取行动。不保证秩序会被打破。
同时,当与流浪(特别是平行的)一起工作时,思考流浪的本质。As per the doc:
如果流水线操作的行为参数是静态的,则流水线的结果可能是不确定或不正确的。一个稳态的兰巴达是一个在执行流水线期间可能发生变化的任何状态的结果。
1 2
| Set <Integer > seen = Collections. synchronizedSet(new HashSet <>());
stream. parallel(). map(e -> { if (seen. add(e )) return 0; else return e ; })... |
在这里,如果映射操作是并行的,那么同样的输入结果也可以从运行到运行,因为通过调度的不同,当一个无条件的兰卜达表示结果时,它们总是相同的。
一般而言,行为参数对流量操作的侧面影响是讨论的问题,因为这些参数通常会引导不受情势所要求的违反行为的影响,以及其他威胁安全危险的情况。
Streams may or may not have a defined encounter order.在水流或非水流在来源和中间操作上都有一个密集的顺序。
- 与所有流操作一样,要知道线程无状态和副作用限制了DOCS.Oracle、COM/JavaSe/ 8 /DOCS/API/Java/UTL/Stuts/HelLip;这两个枚举迭代选项在这方面有很大的不同。
1 2 3 4
| for(Direction dir : Direction.values())
{
} |
如果你不在乎订单
1 2 3 4
| Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
// do stuff
} |
- 提供了导入java.util.enumset和java.util.set
- 从EnumSet的文档中:迭代器方法返回的迭代器按元素的自然顺序(枚举常量声明的顺序)遍历元素。这样可以保证迭代顺序与Enum.values()返回的顺序相匹配。
1 2 3
| for (Direction d : Direction.values()) {
//your code here
} |
尝试为每一个人使用
1 2 3
| for ( Direction direction : Direction. values()){
System. out. println(direction. toString());
} |
Java8
1
| Stream. of(Direction. values()). forEach(System. out::println ); |
From Java5+
1 2 3
| for ( Direction d : Direction. values()){
System. out. println(d );
} |
- 哦,对不起。我刚刚意识到Akhil_Mittal已经发布了类似的答案。
- 什么时候和为什么我应该使用流。of(o).forEach?for循环似乎可读性更强。
- 如果您熟悉函数式编程,则不会。
More methods in Java 8:
使用EnumSet和forEach
1
| EnumSet.allOf(Direction.class).forEach(...); |
使用Arrays.asList和forEach
1
| Arrays. asList(Direction. values()). forEach(... ); |