Hutool 的EnumUtil是一个枚举工具类,提供了多种便捷操作枚举的方法,包括获取枚举名称列表、获取枚举值列表、根据名称获取枚举对象等。
Maven 依赖
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.26</version> </dependency>示例枚举类
public enum Status { SUCCESS(200, "成功"), FAIL(500, "失败"), PROCESSING(100, "处理中"); private int code; private String msg; Status(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public String getMsg() { return msg; } }常用方法
1. 获取枚举名称列表
// 获取所有枚举名称 List<String> names = EnumUtil.getNames(Status.class); // 结果: ["SUCCESS", "FAIL", "PROCESSING"]2. 获取枚举值列表
// 获取所有枚举值 List<Object> values = EnumUtil.getFieldValues(Status.class, "code"); // 结果: [200, 500, 100] List<Object> msgs = EnumUtil.getFieldValues(Status.class, "msg"); // 结果: ["成功", "失败", "处理中"]3. 根据名称获取枚举
// 不区分大小写 Status status = EnumUtil.fromString(Status.class, "success", true); // 结果: Status.SUCCESS // 区分大小写(默认) Status status2 = EnumUtil.fromString(Status.class, "SUCCESS"); // 结果: Status.SUCCESS4. 根据字段值获取枚举
// 根据 code 字段值获取枚举 Status status = EnumUtil.getBy(Status::getCode, 200, Status.class); // 结果: Status.SUCCESS5. 判断枚举是否包含某个名称
boolean contains = EnumUtil.contains(Status.class, "SUCCESS"); // 结果: true boolean containsIgnoreCase = EnumUtil.containsIgnoreCase(Status.class, "success"); // 结果: true6. 获取枚举类信息
// 判断是否为枚举类 boolean isEnum = EnumUtil.isEnum(Status.class); // 结果: true // 获取枚举项数量 int size = EnumUtil.size(Status.class); // 结果: 3 // 判断是否为空枚举 boolean isEmpty = EnumUtil.isEmpty(Status.class); // 结果: false // 判断是否为非空枚举 boolean isNotEmpty = EnumUtil.isNotEmpty(Status.class); // 结果: true7. 获取枚举映射
// 枚举 -> 名称映射 Map<String, Status> enumMap = EnumUtil.getEnumMap(Status.class); // 结果: {"SUCCESS": Status.SUCCESS, "FAIL": Status.FAIL, "PROCESSING": Status.PROCESSING} // 名称 -> 枚举映射(与上面相同,键为名称) Map<String, Status> nameEnumMap = EnumUtil.getNameEnumMap(Status.class);8. 获取枚举值列表(泛型版本)
// 直接返回泛型枚举列表 List<Status> enumList = EnumUtil.toList(Status.class); // 结果: [Status.SUCCESS, Status.FAIL, Status.PROCESSING]9. 根据谓词获取枚举
// 获取第一个满足条件的枚举 Status status = EnumUtil.getFirstBy(Status.class, e -> e.getCode() > 100); // 结果: Status.SUCCESS (code=200)10. 枚举名称转换
// 将枚举名称转换为驼峰形式 String camel = EnumUtil.toCamelCase(Status.SUCCESS.name()); // 结果: "success"完整示例
import cn.hutool.core.util.EnumUtil; import java.util.List; public class EnumUtilDemo { public static void main(String[] args) { // 1. 获取所有枚举名称 List<String> names = EnumUtil.getNames(Status.class); System.out.println("枚举名称: " + names); // 2. 获取所有 code 值 List<Object> codes = EnumUtil.getFieldValues(Status.class, "code"); System.out.println("Code值: " + codes); // 3. 根据名称获取枚举 Status success = EnumUtil.fromString(Status.class, "SUCCESS"); System.out.println("获取枚举: " + success); // 4. 根据字段值获取枚举 Status fail = EnumUtil.getBy(Status::getCode, 500, Status.class); System.out.println("根据code获取: " + fail); // 5. 枚举映射 var enumMap = EnumUtil.getNameEnumMap(Status.class); System.out.println("枚举映射: " + enumMap); // 6. 判断包含 System.out.println("包含SUCCESS? " + EnumUtil.contains(Status.class, "SUCCESS")); } }注意事项
字段访问:
getFieldValues()方法需要字段有对应的 getter 方法或字段本身可访问性能考虑:频繁调用时建议缓存结果,如枚举映射
命名匹配:
fromString()默认区分大小写,可使用重载方法忽略大小写空值处理:大多数方法在参数为 null 时会返回空集合或 false,不会抛出 NPE
总结
EnumUtil简化了枚举的常见操作,避免手写重复的遍历代码。对于复杂的枚举操作(如根据多个条件查找),可以结合 Lambda 表达式使用。