Рубрики
Без рубрики

Итерация по значениям Enum в Java

Изучите три простых способа итерации по перечислению Java.

Автор оригинала: baeldung.

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 Stream 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 () . Чтобы использовать их с перечислением, нам сначала нужно преобразовать перечисление в подходящую коллекцию. Мы можем использовать 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 . Это позволяет нам манипулировать списком , как и любым другим:

List 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 values, он будет неизменяемым, поэтому мы не можем добавлять или удалять элементы из списка . Удаление в следующем коде завершится ошибкой с UnsupportedOperationException :

List days = Arrays.asList(DaysOfWeekEnum.values());
days.remove(0);

3. Заключение

Мы видели различные способы итерации по Enum , используя для каждого, | потока и для цикла в Java. Если нам нужно выполнить какие-либо параллельные операции, то Stream будет хорошим вариантом.

В противном случае нет никаких ограничений на то, какой метод использовать.

Как всегда, код для всех примеров, описанных здесь, можно найти на GitHub .