EnumUtil
EnumUtil是Hutool中用于处理枚举类型的工具类,提供了丰富的枚举操作方法,包括枚举判断、转换、字段操作、映射转换等功能,简化了枚举类型的使用。
# 功能介绍
- 枚举判断:判断类或对象是否为枚举类型
- 枚举转换:支持字符串与枚举值之间的相互转换
- 枚举值获取:通过索引、名称、字段值等多种方式获取枚举值
- 枚举字段操作:获取枚举类的字段名、字段值列表
- 枚举映射转换:将枚举转换为Map,方便使用
- 枚举比较:提供枚举值比较方法
- Lambda支持:支持通过Lambda表达式操作枚举
- 缓存机制:缓存枚举值,提高性能
# 核心方法
# 1. 枚举判断
# isEnum(Type)
判断指定类是否为Enum类。
boolean isEnum1 = EnumUtil.isEnum(Color.class);
// 结果:true
boolean isEnum2 = EnumUtil.isEnum(String.class);
// 结果:false
# isEnum(Object)
判断指定对象是否为Enum类实例。
Color color = Color.RED;
boolean isEnum1 = EnumUtil.isEnum(color);
// 结果:true
String str = "test";
boolean isEnum2 = EnumUtil.isEnum(str);
// 结果:false
# 2. 枚举转换
# fromString
字符串转枚举,调用Enum.valueOf()方法。
Color color = EnumUtil.fromString(Color.class, "RED");
// 结果:Color.RED
# fromStringQuietly
字符串转枚举,转换失败返回null而非报错。
Color color1 = EnumUtil.fromStringQuietly(Color.class, "RED");
// 结果:Color.RED
Color color2 = EnumUtil.fromStringQuietly(Color.class, "INVALID_COLOR");
// 结果:null
# fromString(defaultValue)
字符串转枚举,转换失败返回默认值。
Color color1 = EnumUtil.fromString(Color.class, "RED", Color.DEFAULT);
// 结果:Color.RED
Color color2 = EnumUtil.fromString(Color.class, "INVALID_COLOR", Color.DEFAULT);
// 结果:Color.DEFAULT
# likeValueOf
模糊匹配转换为枚举,匹配枚举中定义的所有字段名。
// 假设有枚举类:
// enum Color {
// RED(1, "红色"),
// GREEN(2, "绿色"),
// BLUE(3, "蓝色");
//
// private int code;
// private String name;
// // 构造方法和getter
// }
Color color1 = EnumUtil.likeValueOf(Color.class, "RED");
// 结果:Color.RED(匹配name字段)
Color color2 = EnumUtil.likeValueOf(Color.class, 1);
// 结果:Color.RED(匹配code字段)
Color color3 = EnumUtil.likeValueOf(Color.class, "红色");
// 结果:Color.RED(匹配name字段)
# 3. 枚举值获取
# getEnumAt
获取给定位置的枚举值。
Color color1 = EnumUtil.getEnumAt(Color.class, 0);
// 结果:Color.RED(第一个枚举值)
Color color2 = EnumUtil.getEnumAt(Color.class, -1);
// 结果:Color.BLUE(最后一个枚举值,支持负索引)
# getNames
获取枚举类中所有枚举对象的name列表。
List<String> names = EnumUtil.getNames(Color.class);
// 结果:["RED", "GREEN", "BLUE"]
# getFieldValues
获取枚举类中各枚举对象下指定字段的值。
// 假设Color枚举有code字段
List<Object> codes = EnumUtil.getFieldValues(Color.class, "code");
// 结果:[1, 2, 3]
# getFieldNames
获取枚举类中所有的字段名。
List<String> fieldNames = EnumUtil.getFieldNames(Color.class);
// 结果:["name", "code"]
# 4. 通过字段值获取枚举
# getBy(SerFunction, C)
通过字段对应值获取枚举,获取不到时为null。
// 使用Lambda表达式
Color color = EnumUtil.getBy(Color::getCode, 1);
// 结果:Color.RED
# getBy(SerFunction, C, E)
通过字段对应值获取枚举,获取不到时返回默认值。
// 使用Lambda表达式
Color color1 = EnumUtil.getBy(Color::getCode, 1, Color.DEFAULT);
// 结果:Color.RED
Color color2 = EnumUtil.getBy(Color::getCode, 999, Color.DEFAULT);
// 结果:Color.DEFAULT
# getBy(Class, Predicate)
通过条件获取枚举,获取不到时为null。
Color color = EnumUtil.getBy(Color.class, c -> c.getCode() > 1);
// 结果:Color.GREEN(第一个满足条件的枚举)
# getFieldBy
通过某字段对应值获取枚举中另一字段值。
// 获取code为1的枚举的name字段值
String name = EnumUtil.getFieldBy(Color::getName, Color::getCode, 1);
// 结果:"红色"
# 5. 枚举映射转换
# getEnumMap
获取枚举字符串值和枚举对象的Map对应,使用LinkedHashMap保证有序。
LinkedHashMap<String, Color> enumMap = EnumUtil.getEnumMap(Color.class);
// 结果:{"RED": Color.RED, "GREEN": Color.GREEN, "BLUE": Color.BLUE}
# getNameFieldMap
获得枚举名对应指定字段值的Map。
// 获取枚举名对应code字段值的Map
Map<String, Object> nameCodeMap = EnumUtil.getNameFieldMap(Color.class, "code");
// 结果:{"RED": 1, "GREEN": 2, "BLUE": 3}
# 6. 枚举比较
# contains
判断指定名称的枚举是否存在。
bool exists1 = EnumUtil.contains(Color.class, "RED");
// 结果:true
bool exists2 = EnumUtil.contains(Color.class, "INVALID_COLOR");
// 结果:false
# notContains
判断指定名称的枚举是否不存在。
bool notExists1 = EnumUtil.notContains(Color.class, "RED");
// 结果:false
bool notExists2 = EnumUtil.notContains(Color.class, "INVALID_COLOR");
// 结果:true
# equals
检查某个枚举值是否匹配指定值。
Color color = Color.RED;
bool isEqual1 = EnumUtil.equals(color, "RED");
// 结果:true
bool isEqual2 = EnumUtil.equals(color, "GREEN");
// 结果:false
# equalsIgnoreCase
忽略大小写检查某个枚举值是否匹配指定值。
Color color = Color.RED;
bool isEqual1 = EnumUtil.equalsIgnoreCase(color, "red");
// 结果:true
bool isEqual2 = EnumUtil.equalsIgnoreCase(color, "green");
// 结果:false
# 7. 其他方法
# toString
Enum对象转String,调用Enum.name()方法。
Color color = Color.RED;
String name = EnumUtil.toString(color);
// 结果:"RED"
# clearCache
清空缓存,重新加载枚举类。
EnumUtil.clearCache();
# getEnums
获取枚举类中的枚举值,调用过的枚举值会缓存。
Color[] colors = EnumUtil.getEnums(Color.class);
// 结果:[Color.RED, Color.GREEN, Color.BLUE]
# 应用场景
# 1. Web开发中的枚举转换
在Web开发中,经常需要将请求参数转换为枚举类型:
@PostMapping("/update-status")
public Result updateStatus(@RequestParam String statusStr) {
// 安全转换字符串为枚举,避免无效值导致的异常
Status status = EnumUtil.fromStringQuietly(Status.class, statusStr);
if (status == null) {
return Result.error("无效的状态值");
}
// 处理业务逻辑
return Result.success();
}
# 2. 数据库查询结果转换
将数据库查询结果转换为枚举类型:
// 假设从数据库查询出状态码为1
int statusCode = 1;
// 根据状态码获取枚举值
Status status = EnumUtil.getBy(Status::getCode, statusCode);
# 3. 枚举值遍历与处理
遍历枚举值并进行处理:
// 获取所有枚举值
Status[] statuses = EnumUtil.getEnums(Status.class);
// 构建状态码到状态名的映射
Map<Integer, String> statusMap = new HashMap<>();
for (Status status : statuses) {
statusMap.put(status.getCode(), status.getName());
}
# 4. 枚举值验证
在表单验证中,验证输入值是否为有效的枚举值:
public void validateForm(Form form) {
// 验证状态值是否有效
if (EnumUtil.notContains(Status.class, form.getStatus())) {
throw new ValidationException("无效的状态值");
}
// 其他验证逻辑
}
# 注意事项
- 缓存机制:
EnumUtil使用缓存存储枚举值,提高性能。如果动态修改了枚举类(虽然不推荐),可以调用clearCache()方法清空缓存。 - Lambda支持:通过Lambda表达式操作枚举时,需要确保Lambda表达式指向的是具体的枚举类,而非泛型。
- 模糊匹配限制:
likeValueOf方法会遍历枚举的所有字段,性能可能不如直接通过fromString方法转换。 - 空值处理:大部分方法都对null值做了处理,返回null或默认值,使用时需注意空指针问题。
- 枚举顺序:枚举的顺序由
enum定义时的顺序决定,可以通过getEnumAt方法按索引获取。
# 总结
EnumUtil提供了全面的枚举操作功能,简化了Java中枚举类型的使用。无论是枚举转换、值获取、字段操作还是映射转换,都能提供简洁高效的解决方案。通过灵活使用EnumUtil,可以大大减少枚举相关的重复代码,提高代码的可读性和可维护性。