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 表达式使用。

相关推荐
第九序言T34 分钟前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路40 分钟前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_4260039644 分钟前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_1 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川2 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人2 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
quantdash_cc2 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl2 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Raas1003 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
BIBI20493 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践