java枚举转list通用类过程
作者:gusijin
文章介绍了如何将Java枚举类型转换为List<Map<String, Object>>的通用类,该类可以实现枚举到列表的转换,并且示例了使用方法
java枚举转list通用类
一、目的
实现枚举转list
转成如下:
[
{
"name": "PC后台",
"value": 1
},
{
"name": "货主端应用",
"value": 2
}
]二、枚举类
public class SysRoleEnum {
/**
* 平台类型
*/
@Getter
@AllArgsConstructor
public enum PlatformTypeEnum implements ICommonEnum {
pcBackground(1, "PC后台"),
customerSystem(2, "货主端应用");
private Integer value;
private String name;
}
}
三、解决方案
java枚举类转List<Map<String, Object>>集合通用类
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
@Slf4j
public class EnumUtil {
/**
* java枚举类转List<Map<String, Object>>集合
*
* @param enumClass
* @return null-该class不是枚举类型 []-该枚举类型没有自定义字段 list-获取该枚举类型的List<Map>返回结果
*/
public static List<Map<String, Object>> enumToListMap(Class<?> enumClass) {
List<Map<String, Object>> resultList = new ArrayList<>();
if (!"java.lang.Enum".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;
}
}使用方法
EnumUtil.enumToListMap(SysRoleEnum.PlatformTypeEnum.class);
请求显示
[
{
"name": "PC后台",
"value": 1
},
{
"name": "货主端应用",
"value": 2
}
]总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
