Перебор значений 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.