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

相关推荐
XMYX-02 小时前
18 - Go 等待协程:WaitGroup 使用与坑
开发语言·golang
baidu_340998822 小时前
PySpark中高效展开嵌套数组:避免笛卡尔爆炸的正确实践.txt
jvm·数据库·python
TechWayfarer2 小时前
IP定位API接口怎么选?在线、离线还是混合?一套决策框架
网络·python·tcp/ip
feifeigo1232 小时前
基于遗传算法的矩形排样MATLAB实现
开发语言·matlab
weixin_580614002 小时前
如何自动同步SQL多语言字段_通过触发器实现国际化更新
jvm·数据库·python
csdn_aspnet2 小时前
告别重复造轮子:Codex写脚本,运维/DevOps场景下,用Codex批量生成Shell/Python自动化脚本
运维·python·ai·自动化·devops·codex·辅助编程
他是龙5512 小时前
65:JS安全&浏览器插件&工具箱等
开发语言·javascript·安全
csbysj20202 小时前
Rust 输出到命令行
开发语言
likerhood2 小时前
Java 中的 `clone()` 与 `Cloneable` 接口详解
java·开发语言·python