Hutool EnumUtil 教程

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"));
    }
}

注意事项

  1. 字段访问getFieldValues() 方法需要字段有对应的 getter 方法或字段本身可访问

  2. 性能考虑:频繁调用时建议缓存结果,如枚举映射

  3. 命名匹配fromString() 默认区分大小写,可使用重载方法忽略大小写

  4. 空值处理:大多数方法在参数为 null 时会返回空集合或 false,不会抛出 NPE

总结

EnumUtil 简化了枚举的常见操作,避免手写重复的遍历代码。对于复杂的枚举操作(如根据多个条件查找),可以结合 Lambda 表达式使用。

相关推荐
iuvtsrt1 小时前
存储过程如何处理海量数据的批处理_循环提交与分段LIMIT结合
jvm·数据库·python
yexuhgu1 小时前
SQL如何检查字符串是否存在:INSTR与LOCATE函数使用
jvm·数据库·python
2301_783848651 小时前
SQL如何用SQL子查询实现关联报表生成_嵌套逻辑关联多表
jvm·数据库·python
八月欢喜1 小时前
【Facebook】 实时消息监控难点解析
javascript·python·facebook
3D探路人2 小时前
模灵 大模型聚合API 转发流程技术实现
java·大数据·开发语言·前端·人工智能·计算机视觉
l1t2 小时前
JIT执行python脚本的工具codon安装和测试
开发语言·python
程似锦吖2 小时前
无中生有 之 从0开始写一个动态定时任务管理
java·开发语言
2501_901006472 小时前
Golang怎么用gRPC Gateway_Golang gRPC Gateway教程【经典】
jvm·数据库·python
2501_901200532 小时前
golang如何实现错误预算Error Budget计算_golang错误预算Error Budget计算实现实战
jvm·数据库·python
2401_867623982 小时前
如何解决OUI图形界面无法调用_xhost与DISPLAY变量设置
jvm·数据库·python