Перейти к основному содержимому

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

· 3 мин. чтения

Задача: Наибольшая подстрока палиндром

Для заданной строки s, верните наибольшую подстроку палиндром входящую в s. Подстрока — это непрерывная непустая последовательность символов внутри строки. Стока является палиндромом, если она читается одинаково в обоих направлениях...

ANDROMEDA 42

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 .