web-dev-qa-db-ja.com

Javaでenumを反復処理するための 'for'ループ

基本的かつ中間的な方向を示すために、私はJavaでenumを持っています。

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

これらの各for値を反復処理するenumループを作成する方法を教えてください。

831
Nick Meyer

.values()

あなたのenumのvalues()メソッドを呼び出すことができます。

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

このvalues()メソッドは コンパイラによって暗黙的に宣言されています 。そのため、 Enum docには記載されていません。

1350
notnoop

Enum#values():

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

次のようにこれをすることができます:

for (Direction direction : EnumSet.allOf(Direction.class)) {
  // do stuff
}
60
toluju

ストリーム

Java 8より前

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

Java 8

ラムダとストリームを利用することもできます( チュートリアル ):

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

なぜストリームでforEachOrderedではなくforEachではないのですか?

forEachの振る舞いは明示的に非決定的です。ここでforEachOrderedは、ストリームが定義されたエンカウンター順序を持っている場合、ストリームのエンカウンター順序で、このストリームの各要素に対してアクションを実行します。そのためforEachは順序が守られることを保証しません。

また、ストリーム(特に並列ストリーム)を扱うときは、ストリームの性質に注意してください。 doc に従って:

ストリーム操作の動作パラメータがステートフルの場合、ストリームパイプラインの結果は決定的ではない、または正しくない可能性があります。ステートフルラムダは、結果がストリームパイプラインの実行中に変化する可能性のある状態に依存するものです。

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

ここで、マッピング操作を並列に実行すると、スレッドスケジューリングの違いにより、同じ入力に対する結果が実行ごとに異なる可能性がありますが、ステートレスラムダ式を使用すると、結果は常に同じになります。

ストリーム操作に対する動作パラメータの副作用は、一般的にはお勧めできません。ステートレス要件の無意味な違反やその他のスレッドセーフの危険性につながる可能性があるためです。

ストリームには、定義済みの出会い順がある場合とない場合があります。ストリームに遭遇順序があるかどうかは、ソースと中間操作によって異なります。

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

}
21
user101884

あなたがこれがうまくいくべき順序を気にしないならば:

Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
    // do stuff
}
19
Tom Jefferys
    for (Direction  d : Direction.values()) {
       //your code here   
    }
18
akf

それぞれを使用してみてください

for ( Direction direction : Direction.values()){
  System.out.println(direction.toString());
}
5
Irazza

Java8

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

java 5以降から

for ( Direction d: Direction.values()){
 System.out.println(d);
}
5
Raghu K Nair

Java 8のその他のメソッド:

EnumSetforEachの併用

EnumSet.allOf(Direction.class).forEach(...);

forEachArrays.asListの併用

Arrays.asList(Direction.values()).forEach(...);
4
NiVeR