Java 遍历枚举值
枚举是Java中数据类型,用于将一组预定义常量赋给变量。本文介绍几种方式遍历枚举值。
1. 定义枚举
首先我们定义枚举,简单示例如下:
public enum DaysOfWeekEnum {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Enum类型没有提供迭代方法,如forEach() 或 iterator(), 我们可以使用其values()方法的返回值。
2. 遍历枚举
2.1 使用for循环
首先使用for循环实现:
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {
System.out.println(day);
}
2.2 使用流方式
我们也可以使用java.util.Stream,我们可以在枚举值上执行相应操作创建流:
Stream.of(DaysOfWeekEnum.values());
或者:
Arrays.stream(DaysOfWeekEnum.values());
这里扩展上面的枚举类,使用流方式实现:
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方法是Java8开始引入,所有集合类都有其实现。为了在枚举中使用,首先需要转换枚举为集合子类。我们可以使用Arrays.asList方法生成ArrayList,然后使用forEach方法:
Arrays.asList(DaysOfWeekEnum.values())
.forEach(day -> System.out.println(day));
2.4 使用EnumSet
EnumSet是针对枚举类型的特殊实现:
EnumSet.allOf(DaysOfWeekEnum.class)
.forEach(day -> System.out.println(day));
2.5 使用枚举类型的ArrayList
我们可以往List中增加枚举值,这样可以按任何顺序操作List:
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);
}
也可以使用 Arrays.asList()方法创建ArrayList。但ArrayList底层的枚举值数组值是不可变的,因此不能对List进行增加或删除项,否则会抛出异常 UnsupportedOperationException:
List<DaysOfWeekEnum> days = Arrays.asList(DaysOfWeekEnum.values());
days.remove(0);
3. 总结
我们看到使用多种方式迭代枚举,forEach,Stream以及for等。如果需要执行并行操作可以使用stream方式,否则几种方式没有太多差异。