1. 概述
在Java中,枚举(Enum)是一种特殊的数据类型,允许我们将一组预定义的常量赋值给变量。虽然枚举本身没有提供像forEach()
或iterator()
这样的迭代方法,但我们可以通过其他方式遍历枚举值。本文将介绍几种遍历枚举值的实用方法,并分析各自的适用场景。
2. 遍历枚举值的方法
首先定义一个基础枚举类用于后续示例:
public enum DaysOfWeekEnum {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
2.1. 使用for循环遍历
最简单直接的方式是使用增强型for循环,通过values()
方法获取枚举值数组:
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {
System.out.println(day);
}
✅ 优点:代码简洁直观,适用于基础遍历场景
❌ 限制:无法直接进行并行处理或复杂流式操作
2.2. 使用Stream API遍历
利用Java 8的Stream API可以实现更灵活的操作。创建Stream有两种方式:
// 方式1:使用Stream.of
Stream.of(DaysOfWeekEnum.values());
// 方式2:使用Arrays.stream
Arrays.stream(DaysOfWeekEnum.values());
为增强实用性,我们扩展枚举类,添加静态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;
}
// 标准getter/setter方法
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
✅ 优点:支持链式操作、并行处理和复杂条件过滤
⚠️ 注意:需要Java 8+环境
2.3. 使用forEach()遍历
将枚举转换为集合后可使用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));
✅ 优点:内存占用低,遍历效率高
⚠️ 注意:EnumSet
内部使用位向量实现,性能优于普通集合
2.5. 使用ArrayList操作枚举值
当需要对枚举值进行增删操作时,可将其存入ArrayList:
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()
创建的List是固定大小的,尝试修改会抛出UnsupportedOperationException
:
List<DaysOfWeekEnum> days = Arrays.asList(DaysOfWeekEnum.values());
days.remove(0); // 抛出异常!
✅ 适用场景:需要动态修改枚举集合时
❌ 限制:直接通过Arrays.asList()
创建的List不可变
3. 总结
本文介绍了五种遍历Java枚举值的方法,选择建议如下:
场景 | 推荐方法 | 理由 |
---|---|---|
基础遍历 | for循环 | 简单高效 |
复杂操作/并行处理 | Stream API | 功能强大,灵活性高 |
函数式风格 | forEach() | 代码简洁 |
高性能遍历 | EnumSet | 专为枚举优化 |
动态修改集合 | ArrayList | 支持增删操作 |
💡 经验之谈:日常开发中,简单遍历用for循环足够;需要数据处理时用Stream;涉及集合操作时根据是否需要修改选择EnumSet或ArrayList。避免踩
Arrays.asList()
的不可变坑!
完整示例代码可在GitHub仓库获取。