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 } ]
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。