基本的かつ中間的な方向を示すために、私はJavaでenum
を持っています。
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
これらの各for
値を反復処理するenum
ループを作成する方法を教えてください。
.values()
あなたのenumのvalues()
メソッドを呼び出すことができます。
for (Direction dir : Direction.values()) {
// do what you want
}
このvalues()
メソッドは コンパイラによって暗黙的に宣言されています 。そのため、 Enum
docには記載されていません。
Enum#values():
for (Direction d : Direction.values()) {
System.out.println(d);
}
次のようにこれをすることができます:
for (Direction direction : EnumSet.allOf(Direction.class)) {
// do stuff
}
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
ラムダとストリームを利用することもできます( チュートリアル ):
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; })...
ここで、マッピング操作を並列に実行すると、スレッドスケジューリングの違いにより、同じ入力に対する結果が実行ごとに異なる可能性がありますが、ステートレスラムダ式を使用すると、結果は常に同じになります。
ストリーム操作に対する動作パラメータの副作用は、一般的にはお勧めできません。ステートレス要件の無意味な違反やその他のスレッドセーフの危険性につながる可能性があるためです。
ストリームには、定義済みの出会い順がある場合とない場合があります。ストリームに遭遇順序があるかどうかは、ソースと中間操作によって異なります。
for(Direction dir : Direction.values())
{
}
あなたがこれがうまくいくべき順序を気にしないならば:
Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
// do stuff
}
for (Direction d : Direction.values()) {
//your code here
}
それぞれを使用してみてください
for ( Direction direction : Direction.values()){
System.out.println(direction.toString());
}
Java8
Stream.of(Direction.values()).forEach(System.out::println);
java 5以降から
for ( Direction d: Direction.values()){
System.out.println(d);
}
Java 8のその他のメソッド:
EnumSet
とforEach
の併用EnumSet.allOf(Direction.class).forEach(...);
forEach
とArrays.asList
の併用Arrays.asList(Direction.values()).forEach(...);