Hutool 的 EnumUtil 是一个枚举工具类,提供了多种便捷操作枚举的方法,包括获取枚举名称列表、获取枚举值列表、根据名称获取枚举对象等。
Maven 依赖
XML
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
示例枚举类
java
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. 获取枚举名称列表
java
// 获取所有枚举名称
List<String> names = EnumUtil.getNames(Status.class);
// 结果: ["SUCCESS", "FAIL", "PROCESSING"]
2. 获取枚举值列表
java
// 获取所有枚举值
List<Object> values = EnumUtil.getFieldValues(Status.class, "code");
// 结果: [200, 500, 100]
List<Object> msgs = EnumUtil.getFieldValues(Status.class, "msg");
// 结果: ["成功", "失败", "处理中"]
3. 根据名称获取枚举
java
// 不区分大小写
Status status = EnumUtil.fromString(Status.class, "success", true);
// 结果: Status.SUCCESS
// 区分大小写(默认)
Status status2 = EnumUtil.fromString(Status.class, "SUCCESS");
// 结果: Status.SUCCESS
4. 根据字段值获取枚举
java
// 根据 code 字段值获取枚举
Status status = EnumUtil.getBy(Status::getCode, 200, Status.class);
// 结果: Status.SUCCESS
5. 判断枚举是否包含某个名称
java
boolean contains = EnumUtil.contains(Status.class, "SUCCESS");
// 结果: true
boolean containsIgnoreCase = EnumUtil.containsIgnoreCase(Status.class, "success");
// 结果: true
6. 获取枚举类信息
java
// 判断是否为枚举类
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);
// 结果: true
7. 获取枚举映射
java
// 枚举 -> 名称映射
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. 获取枚举值列表(泛型版本)
java
// 直接返回泛型枚举列表
List<Status> enumList = EnumUtil.toList(Status.class);
// 结果: [Status.SUCCESS, Status.FAIL, Status.PROCESSING]
9. 根据谓词获取枚举
java
// 获取第一个满足条件的枚举
Status status = EnumUtil.getFirstBy(Status.class, e -> e.getCode() > 100);
// 结果: Status.SUCCESS (code=200)
10. 枚举名称转换
java
// 将枚举名称转换为驼峰形式
String camel = EnumUtil.toCamelCase(Status.SUCCESS.name());
// 结果: "success"
完整示例
java
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 表达式使用。