У меня есть enum
в Java для основных и промежуточных направлений:
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
Как я могу написать
for
цикл, который повторяет каждое из этихenum
значений?
Ответы:
.values()
Вы можете вызвать
values()
метод в вашем enum.Этот
values()
метод неявно объявлен компилятором . Так что это не указано вEnum
док.источник
Все константы типа enum можно получить, вызвав неявный
public static T[] values()
метод этого типа:источник
#
?Enum#values()
=Enum.values()
.
(всегда?)?Вы можете сделать это следующим образом:
источник
Arrays.stream(Enum.values()).forEach(...)
- поток будет последовательнымset
вместоarray
. Это не «лучше», хотя, на мой взгляд, лучше описывает значения перечисления, потому что из определения множества значения в множестве не могут повторяться (как в перечислении), тогда как значения в массиве могут быть.Streams
До Java 8
Java 8
Мы также можем использовать лямбду и потоки ( Tutorial ):
Почему
forEachOrdered
и неforEach
с потоками?Поведение
forEach
является явно недетерминированным, когда asforEachOrdered
выполняет действие для каждого элемента этого потока в порядке обнаружения потока, если поток имеет определенный порядок встречи. ТакforEach
что не гарантирует, что заказ будет сохранен.Также при работе с потоками (особенно параллельными) имейте в виду природу потоков. Согласно документу :
Результаты потокового конвейера могут быть недетерминированными или неправильными, если поведенческие параметры для операций потока являются состоящими. Лямбда с состоянием - это та, результат которой зависит от любого состояния, которое может измениться во время выполнения потокового конвейера.
Здесь, если операция отображения выполняется параллельно, результаты для одного и того же ввода могут отличаться от запуска к выполнению из-за различий в планировании потоков, тогда как при использовании лямбда-выражения без сохранения состояния результаты всегда будут одинаковыми.
Побочные эффекты в поведенческих параметрах для потоковых операций, как правило, не приветствуются, поскольку они часто могут привести к невольным нарушениям требования о безгражданстве, а также другим угрозам безопасности потока.
Потоки могут иметь или не иметь определенный порядок встречи. Наличие у потока порядка встречи зависит от источника и промежуточных операций.
источник
источник
Если вы не заботитесь о заказе, это должно сработать:
источник
EnumSet
: Итератор, возвращенный методом итератора, перебирает элементы в их естественном порядке (порядок, в котором объявлены константы перечисления) . Это гарантирует, что порядок итерации соответствует порядку, возвращенномуEnum.values()
.источник
Java8
с Java5 +
источник
Попробуйте использовать для каждого
источник
Больше методов в Java 8:
Использование
EnumSet
сforEach
Использование
Arrays.asList
сforEach
источник