java-enum-iteration
Iterating over Enum Values in Java
1. Overview
In this quick article, we’ll see different ways in which we can iterate over an Enum in Java.
2. Iterating over Enum Values
public enum DaysOfWeekEnum {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Enums do not have methods for iteration like forEach() or iterator(). Instead, we can use the array of the Enum values returned by the values() method.
2.1. Iterate Using for Loop
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {
System.out.println(day);
}
2.2. Iterate Using Stream
To create a Stream we have two options, one using Stream.of:
Stream.of(DaysOfWeekEnum.values());
Another, using Arrays.stream:
Arrays.stream(DaysOfWeekEnum.values());
So, let us extend the DaysOfWeekEnum class to create an example using 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());
}
}
Now we will write an example in order to print the non-working days:
public class EnumStreamExample {
public static void main() {
DaysOfWeekEnum.stream()
.filter(d -> d.getTypeOfDay().equals("off"))
.forEach(System.out::println);
}
}
The output we get when we run this:
SUNDAY
SATURDAY
2.3. Iterate Using forEach()
The forEach() method was added to the Iterable interface in Java 8. So all the java collection classes have implementations of a forEach() method. In order to use these with an Enum, we first need to convert the Enum to a suitable collection. We can use Arrays.asList() to generate an ArrayList which we can then loop around using the forEach() method:
Arrays.asList(DaysOfWeekEnum.values())
.forEach(day -> System.out.println(day));
2.4. Iterate Using EnumSet
EnumSet.allOf(DaysOfWeekEnum.class)
.forEach(day -> System.out.println(day));
2.5. Using an ArrayList of Enum Values
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);
}
We can also create an ArrayList by using Arrays.asList().
However, as the ArrayList is backed by the Enum values array it will be immutable, so we can’t add or remove items from the List. The remove in the following code would fail with an UnsupportedOperationException:
List<DaysOfWeekEnum> days = Arrays.asList(DaysOfWeekEnum.values());
days.remove(0);
3. Conclusion
We saw various ways to iterate over an Enum using forEach, Stream, and for loop in Java. If we need to perform any parallel operations, Stream would be a good option.
Otherwise, there is no restriction on which method to use.
As always, the code for all the examples explained here can be found over on GitHub.