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

相关推荐
集成显卡2 小时前
Rust实战七 |基于带 colored 颜色文字控制台的批量文件删除工具
开发语言·后端·rust
苦青藤2 小时前
从零搭建 WSUS 隔离网络:完整实战指南(内网离线补丁分发)
运维·windows·microsoft
lifloveyou3 小时前
table接口结构
python
比昨天多敲两行3 小时前
linux 线程概念与控制
java·开发语言·jvm
huaweichenai3 小时前
php 根据每个类型的抽签范围实现抽签功能
开发语言·php
codeejun4 小时前
每日一Go-73、云原生成本优化 —— 资源限制 & 指标驱动扩容
开发语言·云原生·golang
Warson_L4 小时前
class 扩展
python
就叫_这个吧5 小时前
Java注解、元注解、自定义注解定义及应用
java·开发语言·注解
Sam_Deep_Thinking5 小时前
聊聊Java中的of
java·开发语言·架构
前端与小赵5 小时前
Python 数据结构陷阱与复数运算优化:列表、元组、字典成员操作辨析及 NumPy 高效实践
python