场景:
在开发过程中,经常会遇到需要根据枚举的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;
}