Java Enum枚举转列表返回

Posted 飞廉灬少将

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Enum枚举转列表返回相关的知识,希望对你有一定的参考价值。

场景:

在开发过程中,经常会遇到需要根据枚举的code获取对应name或根据name获取对应code的需求;抑或是需要根据code或name获取对应枚举对象。
甚至前端需要获取下拉框中的数据项,做为查询条件传参,然后前端又不想写死,需要后端提供接口返回


示例:

/**
 * @author 飞廉少将
 * @program: wms
 * @description: 测试枚举
 * @time 2022/9/1
 */
public enum TestEnums 

    SAVE(0, "保存/新建"),
    ENABLE(1, "启用"),
    DISABLE(2,"禁用"),
    FREEZE(3, "冻结");

    TestEnums(Integer code, String msg) 
        this.code = code;
        this.msg = msg;
    
    TestEnums(Integer code) 
        this.code = code;
    


    private Integer code;
    private String msg;

    public Integer getCode() 
        return code;
    

    public void setCode(Integer code) 
        this.code = code;
    

    public String getMsg() 
        return msg;
    

    public void setMsg(String msg) 
        this.msg = msg;
    



效果:

前端页面展示:

后端接口返回:


解决方案 1:

如果只是少量使用,那就可以在需要转换成列表的枚举类中添加toList()方法,然后再提供一个对外接口就可以了(缺点真的是烦啊,每个枚举(enum)里面都要加toList()方法)

	public static List<Map<String, String>> toList() 
            List<Map<String, String>> list = new ArrayList<>();
            for (TestEnums testEnum: TestEnums.values()) 
                Map<String, String> map = new HashMap<>();
                map.put("code", item.getCode());
                map.put("msg", item.getMsg());
                list.add(map);
            
            return list;
        

解决方案 2:

使用工具类的话就不需要每个枚举(enum)都加一遍toList()方法了!

/**
 * @author 飞廉少将
 * @program: wms
 * @description: 枚举转列表
 * @time 2022/9/1
 */
@Slf4j
public class EnumUtils 
    private static final String ENUM_CLASSPATH = "java.lang.Enum";

    public static List<Map<String, Object>> enumToListMap(Class<?> enumClass) 
        List<Map<String, Object>> resultList = new ArrayList<>();
        if (!ENUM_CLASSPATH.equals(enumClass.getSuperclass().getCanonicalName())) 
            return resultList;
        
        // 获取所有public方法
        Method[] methods = enumClass.getMethods();
        List<Field> fieldList = new ArrayList<>();
        // step 1:通过get方法提取字段,所以避免get作为自定义方法的开头,建议使用 ‘find’或其他命名
        Arrays.stream(methods).map(Method::getName).filter(
                        methodName -> methodName.startsWith("get") && !"getDeclaringClass".equals(methodName) && !"getClass".equals(methodName)
                ).forEachOrdered(methodName -> 
            try 
                Field field = enumClass.getDeclaredField(StringUtils.uncapitalize(methodName.substring(3)));
                fieldList.add(field);
             catch (NoSuchFieldException | SecurityException e) 
                log.error(e.getMessage(), e);
            
        );

        // step 2:将字段作为key,逐一把枚举值作为value 存入list
        if (CollectionUtils.isEmpty(fieldList)) 
            return resultList;
        
        
        Enum[] enums = (Enum[]) enumClass.getEnumConstants();
        for (Enum anEnum : enums) 
            Map<String, Object> map = new HashMap<>(fieldList.size());
            for (Field field : fieldList) 
                field.setAccessible(true);
                try 
                    // 向map集合添加字段名称 和 字段值
                    map.put(field.getName(), field.get(anEnum));
                 catch (IllegalArgumentException | IllegalAccessException e) 
                    log.error(e.getMessage(), e);
                
            
            // 将Map添加到集合中
            resultList.add(map);
        
        return resultList;
    

以上是关于Java Enum枚举转列表返回的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin基础(十四) 枚举类(enum)数据类(data)和密封类(sealed)与java的写法差异

Java enum(枚举)的用法详解(转)

Kotlin基础(十四) 枚举类(enum)与java的写法差异

Java enum的用法详解[转]

java枚举类型

JAVA基础枚举