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的写法差异