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仓库获取。