Цикл for для перебора перечисления в Java - PullRequest
832 голосов
/ 09 июля 2009

У меня есть enum на Java для кардинального и промежуточного направлений:

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

Как я могу написать for цикл, который повторяет каждое из этих enum значений?

Ответы [ 10 ]

1356 голосов
/ 09 июля 2009

.values()

Вы можете вызвать метод values() в вашем перечислении.

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

Этот values() метод неявно объявлен компилятором . Так что он не указан в Enum док.

124 голосов
/ 09 июля 2009

Enum значения # ():

 for (Direction d : Direction.values()) {
     System.out.println(d);
 }
60 голосов
/ 09 июля 2009

Вы можете сделать это следующим образом:

for (Direction direction : EnumSet.allOf(Direction.class)) {
  // do stuff
}
39 голосов
/ 21 июня 2015

Streams

До Java 8

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

Java 8

Мы также можем использовать лямбду и потоки ( Tutorial ):

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; })...

Здесь, если операция отображения выполняется параллельно, результаты для одного и того же ввода могут варьироваться от прогона к прогоне из-за различий в планировании потоков, тогда как при использовании лямбда-выражения без сохранения состояния результаты всегда будут одинаковыми.

Побочные эффекты в поведенческих параметрах для потоковых операций, как правило, не приветствуются, поскольку они часто могут привести к невольным нарушениям требования о безгражданстве, а также другим угрозам безопасности потоков.

Потоки могут иметь или не иметь определенный порядок встречи. Наличие в потоке порядка встречи зависит от источника и промежуточных операций.

21 голосов
/ 09 июля 2009
for(Direction dir : Direction.values())
{

}
19 голосов
/ 09 июля 2009

Если вы не заботитесь о заказе, это должно сработать:

Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
    // do stuff
}
18 голосов
/ 09 июля 2009
    for (Direction  d : Direction.values()) {
       //your code here   
    }
5 голосов
/ 23 июня 2016

Попробуйте использовать для каждого

for ( Direction direction : Direction.values()){
  System.out.println(direction.toString());
}
5 голосов
/ 25 февраля 2016

Java8

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

с Java5 +

for ( Direction d: Direction.values()){
 System.out.println(d);
}
4 голосов
/ 23 мая 2018

Дополнительные методы в Java 8:

Использование EnumSet с forEach

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

Использование Arrays.asList с forEach

Arrays.asList(Direction.values()).forEach(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...