JAVA枚举工具类

该代码实现了一个枚举处理工具类,包括通过属性值匹配枚举、获取枚举数组供前端使用等功能。类中静态初始化缓存了所有指定包下的枚举,提供了根据枚举名称或属性值查找枚举的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现好多枚举里面都写了一个匹配的方法,于是想着写一个公共方法:

1,通过枚举的某个属性的值获取枚举

@UtilityClass
public class EnumUtil {

   /**
     * K 枚举类型, V 当前类型的枚举数组
     */
    private Map<String,Enum []> enumMapBySimpleName = new ConcurrentHashMap<>();

   /**
     * 枚举包名
     */
    private final String ENUM_PACKAGE = "net.xx.xx.xx.enums";

    static {
        // 缓存所有枚举
        Set<Class<?>> enums = ClassUtil.scanPackageBySuper(ENUM_PACKAGE, Enum.class);
        enums.forEach(e->{
            enumMapBySimpleName.put(e.getSimpleName(), (Enum[]) e.getEnumConstants());
        });
    }

    /**
     * 已知枚举类型和枚举某个属性值匹配枚举
     * @param enumClass 枚举类型
     * @param function 枚举属性get方法
     * @param paramValue 属性匹配值
     * @param <T> 枚举
     * @param <R> 属性类型
     * @return 枚举数组
     */
    public <T extends Enum<T>,R extends Object> T match(Class<T> enumClass, Function<T,R> function, R paramValue){
        Enum[] enums = enumMapBySimpleName.get(enumClass.getSimpleName());
        return Arrays.stream(enums).map(e->(T)e).filter(e->function.apply(e).equals(paramValue)).findFirst().orElse(null);
    }
}
EnumUtil.match(ConfigTypeEnum.class, ConfigTypeEnum::getCode,1)

2,返回所有枚举数据给前端下拉列表使用

@UtilityClass
public class EnumUtil {

    /**
     * K 枚举类型, V 当前类型的枚举数组
     */
    private Map<String,Enum []> enumMapBySimpleName = new ConcurrentHashMap<>();

    /**
     * 前端获取枚举数据列表传的属性名称拼接后缀
     */
    private final String SUFFIX = "Enum";

    /**
     * 枚举包名
     */
    private final String ENUM_PACKAGE = "net.xx.xx.xx.enums";

    static {
        // 缓存所有枚举
        Set<Class<?>> enums = ClassUtil.scanPackageBySuper(ENUM_PACKAGE, Enum.class);
        enums.forEach(e->{
            enumMapBySimpleName.put(e.getSimpleName(), (Enum[]) e.getEnumConstants());
        });
    }

    /**
     * 已知枚举类型和枚举某个属性值匹配枚举
     * @param enumClass 枚举类型
     * @param function 枚举属性get方法
     * @param paramValue 属性匹配值
     * @param <T> 枚举
     * @param <R> 属性类型
     * @return 枚举数组
     */
    public <T extends Enum<T>,R extends Object> T match(Class<T> enumClass, Function<T,R> function, R paramValue){
        Enum[] enums = enumMapBySimpleName.get(enumClass.getSimpleName());
        return Arrays.stream(enums).map(e->(T)e).filter(e->function.apply(e).equals(paramValue)).findFirst().orElse(null);
    }

    /**
     * 根据枚举名称获取枚举数组
     *
     * @param enumName 枚举名称 支持首字母小写、无'Enum'后缀
     * @return 枚举数组
     */
    public Enum [] findEnumsByName(String enumName){
        String enumSimpleName = enumNameConvert(enumName);
        return enumMapBySimpleName.get(enumSimpleName);
    }

    /**
     * 根据多个枚举名称获取枚举值
     * @param enumNames 枚举名称
     * @return 枚举数组Map
     */
    public Map<String, Enum[]> findEnumsByNames(List<String> enumNames){
        Map<String, Enum[]> result = new HashMap<>(8);
        enumNames.forEach(enumName->{
            result.put(enumName,findEnumsByName(enumName));
        });
        return result;
    }

    /**
     * 补全名称  首字母转大写,无'Enum'后缀时添加'Enum'后缀
     * enable ==> EnableEnum
     * Enable ==> EnableEnum
     * enableEnum  ==> EnableEnum
     * @param enumName 枚举名称 支持首字母小写,无'Enum'后缀
     * @return 枚举全名
     */
    private String enumNameConvert(String enumName){
        if(!enumName.endsWith(SUFFIX)){
            enumName = enumName+SUFFIX;
        }
        return StringUtils.capitalize(enumName);
    }

}

注意枚举类加上注解

@JsonFormat(shape = JsonFormat.Shape.OBJECT)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值