1. Обзор
В Java Enum
— это тип данных, который помогает нам присвоить предопределенный набор констант переменной.
В этом кратком руководстве мы изучим различные способы перебора Enum
в Java.
2. Перебор значений Enum
Давайте сначала определим 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.Stream
для выполнения операций со значениями Enum
.
Чтобы создать поток,
у нас есть два варианта. Первый использует Stream.of
:
Stream.of(DaysOfWeekEnum.values());
Второй использует Arrays.stream
:
Arrays.stream(DaysOfWeekEnum.values());
Давайте расширим класс DaysOfWeekEnum
, чтобы создать пример с использованием 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 Stream<DaysOfWeekEnum> stream() {
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()
. Чтобы использовать их с Enum
, нам сначала нужно преобразовать Enum
в подходящую коллекцию. Мы можем использовать 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
_
Мы также можем добавить значения Enum
в список
. Это позволяет нам манипулировать списком
, как и любым другим:
List<DaysOfWeekEnum> days = 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
, он будет неизменяем, поэтому мы не можем добавлять или удалять элементы из списка.
Удаление в следующем коде завершится ошибкой UnsupportedOperationException
:
List<DaysOfWeekEnum> days = Arrays.asList(DaysOfWeekEnum.values());
days.remove(0);
3. Заключение
В этой статье мы обсудили различные способы перебора Enum
с использованием forEach,
Stream
и цикла for
в Java.
Если нам нужно выполнить какие-то параллельные операции, Stream
— хороший вариант. В противном случае ограничений на использование метода нет.
Как всегда, код для всех описанных здесь примеров можно найти на GitHub .