1. Обзор
Enum в Java-это тип данных, который помогает нам присвоить переменной заранее определенный набор констант.
В этой краткой статье мы рассмотрим различные способы, с помощью которых мы можем перебирать Enum в Java.
2. Итерация По Значениям Перечисления
Давайте сначала определим Enum , чтобы мы могли создать несколько простых примеров кода:
public enum DaysOfWeekEnum { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }
Перечисления не имеют методов для итерации, таких как forEach() или iterator() . Вместо этого мы можем использовать массив значений Enum , возвращаемых методом values () .
2.1. Итерация С Использованием цикла for
Во-первых, мы можем просто использовать старомодный цикл for :
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) { System.out.println(day); }
2.2. Итерация С Использованием Потока
Мы также можем использовать java.util.Поток . Так что мы можем выполнять операции над значениями Enum .
Для создания Stream у нас есть два варианта, один из которых использует Stream.of :
Stream.of(DaysOfWeekEnum.values());
Другой, используя Arrays.stream :
Arrays.stream(DaysOfWeekEnum.values());
Итак, давайте расширим класс Dayofweek enum , чтобы создать пример с использованием Stream :
public enum DaysOfWeekEnum { SUNDAY("off"), MONDAY("working"), TUESDAY("working"), WEDNESDAY("working"), THURSDAY("working"), FRIDAY("working"), SATURDAY("off"); private String typeOfDay; DaysOfWeekEnum(String typeOfDay) { this.typeOfDay = typeOfDay; } // standard getters and setters public static Streamstream() { return Stream.Of(DaysOfWeekEnum.values()); } }
Теперь мы напишем пример для того, чтобы напечатать нерабочие дни:
public class EnumStreamExample { public static void main() { DaysOfWeekEnum.stream() .filter(d -> d.getTypeOfDay().equals("off")) .forEach(System.out::println); } }
Результат, который мы получаем, когда запускаем это:
SUNDAY SATURDAY
2.3. Итерация С Использованием forEach()
Метод forEach() был добавлен в интерфейс Iterable в Java 8. Таким образом, все классы коллекций java имеют реализации метода forEach () . Чтобы использовать их с перечислением, нам сначала нужно преобразовать перечисление в подходящую коллекцию. Мы можем использовать Arrays.asList() для создания ArrayList , который затем можно обойти с помощью метода forEach() :
Arrays.asList(DaysOfWeekEnum.values()) .forEach(day -> System.out.println(day));
2.4. Итерация С Использованием EnumSet
EnumSet – это специализированная реализация набора, которую мы можем использовать с типами Enum :
EnumSet.allOf(DaysOfWeekEnum.class) .forEach(day -> System.out.println(day));
2.5. Использование ArrayList значений перечисления
Мы также можем добавить значения Enum в List . Это позволяет нам манипулировать списком , как и любым другим:
Listdays = new ArrayList<>(); days.add(DaysOfWeekEnum.FRIDAY); days.add(DaysOfWeekEnum.SATURDAY); days.add(DaysOfWeekEnum.SUNDAY); for (DaysOfWeekEnum day : days) { System.out.println(day); } days.remove(DaysOfWeekEnum.SATURDAY); if (!days.contains(DaysOfWeekEnum.SATURDAY)) { System.out.println("Saturday is no longer in the list"); } for (DaysOfWeekEnum day : days) { System.out.println(day); }
Мы также можем создать ArrayList с помощью Arrays.asList() .
Однако, поскольку ArrayList поддерживается массивом Enum values, он будет неизменяемым, поэтому мы не можем добавлять или удалять элементы из списка . Удаление в следующем коде завершится ошибкой с UnsupportedOperationException :
Listdays = Arrays.asList(DaysOfWeekEnum.values()); days.remove(0);
3. Заключение
Мы видели различные способы итерации по Enum , используя для каждого, | потока и для цикла в Java. Если нам нужно выполнить какие-либо параллельные операции, то Stream будет хорошим вариантом.
В противном случае нет никаких ограничений на то, какой метод использовать.
Как всегда, код для всех примеров, описанных здесь, можно найти на GitHub .