Перебор значений Enum в Java

Перебор значений Enum в Java

1. обзор

Enum в Java - это тип данных, который помогает нам назначать предопределенный набор констант переменной.

В этой быстрой статье мы увидим различные способы перебораEnum в Java.

2. Итерация значенийEnum

Давайте сначала определимEnum, чтобы мы могли создать несколько простых примеров кода:

public enum DaysOfWeekEnum {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
}

В перечислениях нет таких методов для итерации, какforEach() илиiterator(). Вместо этого мы можем использовать массив значенийEnum, возвращаемых методомvalues().

2.1. Итерация с использованием цикла

Во-первых, мы можем просто использовать старый циклfor:

for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {
    System.out.println(day);
}

2.2. Итерировать с использованиемStream

Мы также можем использоватьjava.util.Stream. Чтобы мы могли выполнять операции со значениямиEnum.

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

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

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

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

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

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