回答:
.values()
values()
列挙型でメソッドを呼び出すことができます。
for (Direction dir : Direction.values()) {
// do what you want
}
このvalues()
メソッドはコンパイラによって暗黙的に宣言されます。そのため、Enum
ドキュメントには記載されていません。
列挙型のすべての定数は、public static T[] values()
その型の暗黙のメソッドを呼び出すことによって取得できます。
for (Direction d : Direction.values()) {
System.out.println(d);
}
#
ますか?
Enum#values()
=Enum.values()
.
(いつも?)を使うのと同じですか?
これは次のようにして行うことができます。
for (Direction direction : EnumSet.allOf(Direction.class)) {
// do stuff
}
Arrays.stream(Enum.values()).forEach(...)
-ストリームは順次になります
set
代わりですarray
。セットの定義から、セットの値は(列挙型のように)繰り返すことはできませんが、配列の値は繰り返すことができるため、「より良い」とは言えません。
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
ラムダとストリームを使用することもできます(チュートリアル):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
なぜストリームforEachOrdered
ではないのforEach
ですか?
の動作forEach
は明示的に非決定的forEachOrdered
です。ストリームが定義済みの遭遇順序を持っている場合、はこのストリームの各要素のアクションをストリームの遭遇順序で実行します。したがってforEach
、注文が保持されることは保証されません。
また、ストリーム(特に並列ストリーム)を使用する場合は、ストリームの性質に注意してください。ドキュメントに従って:
ストリームオペレーションの動作パラメータがステートフルである場合、ストリームパイプラインの結果は非決定的または不正確になる可能性があります。ステートフルラムダは、ストリームパイプラインの実行中に変化する可能性のあるすべての状態に依存するラムダです。
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
ここで、マッピング操作が並列に実行されると、スレッドスケジューリングの違いにより、同じ入力の結果が実行ごとに異なる可能性がありますが、ステートレスラムダ式では、結果は常に同じになります。
ストリーム操作に対する動作パラメータの副作用は、一般に推奨されません。これらは、無意識の要件の意図しない違反や、その他のスレッドセーフティの危険につながることが多いためです。
ストリームには、定義されたエンカウンター順序がある場合とない場合があります。ストリームに遭遇順序があるかどうかは、ソースと中間操作に依存します。
for(Direction dir : Direction.values())
{
}
注文を気にしない場合、これはうまくいくはずです:
Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
// do stuff
}
EnumSet
:iteratorメソッドによって返される反復子その中の要素を横断自然順序(enum定数の宣言された順)。これにより、反復の順序がによって返される順序と一致することが保証されEnum.values()
ます。
Java8
Stream.of(Direction.values()).forEach(System.out::println);
Java5以降
for ( Direction d: Direction.values()){
System.out.println(d);
}