JAVA枚举工具类

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

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

@UtilityClass
public class EnumUtil {

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

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

    static {
        // 缓存所有枚举
        Set> 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  枚举
     * @param  属性类型
     * @return 枚举数组
     */
    public ,R extends Object> T match(Class enumClass, Function 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 enumMapBySimpleName = new ConcurrentHashMap<>();

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

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

    static {
        // 缓存所有枚举
        Set> 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  枚举
     * @param  属性类型
     * @return 枚举数组
     */
    public ,R extends Object> T match(Class enumClass, Function 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 findEnumsByNames(List enumNames){
        Map 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)

你可能感兴趣的:(Enum,JAVA,java,开发语言)