java读取枚举类的值转成list和map方式

 更新时间:2023年07月24日 14:29:47   作者:不写bug的程序媛  
这篇文章主要介绍了java读取枚举类的值转成list和map方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java读取枚举类的值转成list和map

首先Enum类

public enum RuleTypeEnum {  
  //officeClerk,estimator,administrator,personnel都是国际化的key值
    officeClerk("officeClerk",99),  
    estimator("estimator",1),     
    administrator("administrator",2), 
    personnel("personnel",3);      
   private String reason;
    private int index;
    RuleTypeEnum(String reason, int index) {
        this.reason = reason;
        this.index = index;
    }
    public String getReason() {
        return reason;
    }
    public void setReason(String reason) {
        this.reason = reason;
    }
    public int getIndex() {
        return index;
    }
    public void setIndex(int index) {
        this.index = index;
    } 
}

下面为Enum工具类

public class EnumUtils {
  private static Logger log= LoggerFactory.getLogger(EnumUtils.class); 
    /**
     *  把枚举类的值都转成Map
     * @param enumT 枚举类
     * @param methodNames 读取的方法
     * @param <T>
     * @return
     */
    public static <T> Map<String, String> EnumToMap(Class<T> enumT,String... methodNames) {
        Map<String, String> enummap = new HashMap<String, String>();
        if (!enumT.isEnum()) { //如果不是enum
            return enummap;
        }
        T enums []= enumT.getEnumConstants(); //得到枚举类里的实例
        if (enums == null || enums.length <= 0) {
            return enummap;
        }
        int count = methodNames.length;
        /**默认接口key方法*/
        String keyMathod = "getReason";
        /**默认接口value方法*/
        String valueMathod = "getIndex";
        if (count >= 1 && !"".equals(methodNames[0])) {
            keyMathod = methodNames[0];
        }
        if (count == 2 && !"".equals(methodNames[1])) {
            valueMathod = methodNames[1];
        }
        for (int i = 0;i < enums.length; i++) {
            T tobj = enums[i];
            try {
                /**获取key值*/
                Object resultkey = getMethodValue(keyMathod, tobj);
                if ("".equals(resultkey)) {
                    continue;
                }
                /**获取value值*/
                Object resultValue = getMethodValue(valueMathod, tobj);
                /**如果描述不存在获取整条enum*/
                if ("".equals(resultValue)) {
                    resultValue = tobj;
                }
                enummap.put(resultkey+"", resultValue+"");
            } catch (Exception e) {
                e.printStackTrace();
                log.error("枚举类转成Map异常",e);
            }
        }
        return enummap;
    }
    private static <T> Object getMethodValue(String methodName, T obj, Object... args) {
        Object resut = "";
        try {
            /********************************* start *****************************************/
            /**获取方法数组,这里只要公有的方法*/
            Method[] methods = obj.getClass().getMethods();
            if (methods.length <= 0) {
                return resut;
            }
            Method method = null;
            for (int i = 0, len = methods.length; i < len; i++) {
                /**忽略大小写取方法*/
                if (methods[i].getName().equalsIgnoreCase(methodName)) {
                    /**如果存在,则取出正确的方法名称*/
                    methodName = methods[i].getName();
                    method = methods[i];
                    break;
                }
            }
            /*************************** end ***********************************************/
            if (method == null) {
                return resut;
            }
            /**方法执行*/
            resut = method.invoke(obj, args);
            if (resut == null) {
                resut = "";
            }
            /**返回结果*/
            return resut;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resut;
    }
    /***
     *  取枚举的key 和 value 返回list
     * @param enumT 枚举类
     * @param methodNames 取枚举类的方法
     * @param <T>
     * @return
     */
    public static <T> List<EnumEntity> getEnumToList(Class<T> enumT, String... methodNames) {
        List<EnumEntity> enumList = new ArrayList<>(); //最终返回的list  enumEntity是对枚举类的封装实体
        if (!enumT.isEnum()) {
            return enumList;
        }
        T enums[] = enumT.getEnumConstants();  //得么枚举类里所有的枚举类
        if (enums.length == 0) {  //如果没有枚举键和值   结束
            return enumList;
        }
        int count = methodNames.length;
        String keyMethod = "getReason";  //默认的取 key的方法
        String valueMethod = "getIndex";  //默认的取 value 的方法
        if (count >= 1 && !methodNames[0].equals("")) { //如果方法的长度是大于等于1的,并且不为空
            keyMethod = methodNames[0];
        }
        if (count == 2 && !methodNames[1].equals("")) { //如果方法的长度是等于2的,并且不为空
            valueMethod = methodNames[1];
        }
        try {
            for (int i = 0; i < enums.length; i++) {
                EnumEntity enumEntity = new EnumEntity();
                T object = enums[i];     //得到枚举类里每条值
                Object resultKey = getMethodValue(keyMethod, object); //获取key值
                if (resultKey.equals("")) {
                    continue;
                }
                Object resultValue = getMethodValue(valueMethod, object); //获取value值
                if (resultValue.equals("")) {
                    resultValue = object;
                }
                //MessageUtils.getMessage为读取国际化的.
                enumEntity.setKey(MessageUtils.getMessage(resultKey.toString()));  //把key存到实体类
                enumEntity.setValue(resultValue.toString()); //把value存到实体类
                enumList.add(enumEntity);   //存到list
            }
        } catch (Exception e) {
            e.getStackTrace();
            log.error("枚举类转成List异常", e);
        }
        return enumList;
    }
}

下面是调用的方法

public List<EnumEntity> getRuleType() { Class<RuleTypeEnum> clasz= RuleTypeEnum.class; List<EnumEntity> list= EnumUtils.getEnumToList(clasz); 
//用默认的方法名 getReason和getIndex return list; }

完美~

通用java枚举类转List-Map集合

java的枚举类功能是很强大的,在平时开发中也用的比较多,有时候可能会有将枚举类转成List集合这种需求,如果能确定枚举类中的字段固定可以使用实体类接收,如果不固定的话,很多时候只能用Map来接收了。

这里实现一下java枚举类转List-Map集合

    /**
     * java枚举类转List<Map>集合
     * 
     * @param clazz
     * @return null-该class不是枚举类型  []-该枚举类型没有自定义字段  list-获取该枚举类型的List<Map>返回结果
     */
    public static List<Map<String, Object>> enumToListMap(Class<?> clazz) {
        List<Map<String, Object>> resultList = null;
        // 判断是否是枚举类型
        if ("java.lang.Enum".equals(clazz.getSuperclass().getCanonicalName())) {
            resultList = new ArrayList<>();
            // 获取所有public方法
            Method[] methods = clazz.getMethods();
            List<Field> fieldList = new ArrayList<>();
            for (int i = 0; i < methods.length; i++) {
                String methodName = methods[i].getName();
                if (methodName.startsWith("get") && !"getDeclaringClass".equals(methodName)
                    && !"getClass".equals(methodName)) { // 找到枚举类中的以get开头的(并且不是父类已定义的方法)所有方法
                    Field field = null;
                    try {
                        field = clazz.getDeclaredField(StringUtils.uncapitalize(methodName.substring(3))); // 通过方法名获取自定义字段
                    } catch (NoSuchFieldException | SecurityException e) {
                        e.printStackTrace();
                    }
                    if (field != null) { // 如果不为空则添加到fieldList集合中
                        fieldList.add(field);
                    }
                }
            }
            if (!fieldList.isEmpty()) { // 判断fieldList集合是否为空
                Map<String, Object> map = null;
                Enum<?>[] enums = (Enum[])clazz.getEnumConstants(); // 获取所有枚举
                for (int i = 0; i < enums.length; i++) {
                    map = new HashMap<>();
                    for (int l = 0, len = fieldList.size(); l < len; l++) {
                        Field field = fieldList.get(l);
                        field.setAccessible(true);
                        try {
                            map.put(field.getName(), field.get(enums[i])); // 向map集合添加字段名称 和 字段值
                        } catch (IllegalArgumentException | IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    }
                    resultList.add(map);// 将Map添加到集合中
                }
            }
        }
        return resultList;
    }

新建几个枚举类和普通类测试一下

public class TestEnum0 {
}
public enum TestEnum1 {
    TestEnum1;
}
public enum TestEnum2 {
    TestEnum2("TestEnum2");
    private String name;
    TestEnum2(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
public enum TestEnum3 {
    TestEnum3(1, "TestEnum3", "测试枚举类");
    private int id;
    private String message;
    private String desc;
    TestEnum3(int id, String message, String desc) {
        this.id = id;
        this.message = message;
        this.desc = desc;
    }
    public int getId() {
        return id;
    }
    public String getMessage() {
        return message;
    }
    public String getDesc() {
        return desc;
    }
}

编写测试方法

@Test
    public void enumToListMapTest() {
        // 普通类
        System.out.println(enumToListMap(TestEnum0.class));
        // 枚举类
        System.out.println(enumToListMap(TestEnum1.class));
        System.out.println(enumToListMap(TestEnum2.class));
        System.out.println(enumToListMap(TestEnum3.class));
    }

运行结果:

null
[]
[{name=TestEnum2}]
[{id=1, message=TestEnum3, desc=测试枚举类}]

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java快速入门掌握类与对象及变量的使用

    Java快速入门掌握类与对象及变量的使用

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-04-04
  • Java中如何读取和写入zip文件问题

    Java中如何读取和写入zip文件问题

    这篇文章主要介绍了Java中如何读取和写入zip文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • spring本地事务失效的原因分析

    spring本地事务失效的原因分析

    这篇文章给大家介绍了spring本地事务失效的情况原因分析,给大家罗列了五种原因分析,通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • java图形化界面实现登录窗口

    java图形化界面实现登录窗口

    这篇文章主要为大家详细介绍了java图形化界面实现登录窗口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • mybatis拦截器注册初始化编写示例及如何生效详解

    mybatis拦截器注册初始化编写示例及如何生效详解

    这篇文章主要为大家介绍了mybatis拦截器注册初始化编写示例及如何生效详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • SpringAOP中的注解配置详解

    SpringAOP中的注解配置详解

    这篇文章主要介绍了SpringAOP中的注解配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • java外部类与内部类的关系详解

    java外部类与内部类的关系详解

    本文详细讲解了java外部类与内部类的关系,用代码演示了外部类调用内部类的方法。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • CompletableFuture创建及功能使用全面详解

    CompletableFuture创建及功能使用全面详解

    这篇文章主要为大家介绍了CompletableFuture创建及功能使用全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • java List集合接口的介绍和使用全面教程

    java List集合接口的介绍和使用全面教程

    这篇文章主要为大家介绍了java List集合接口的介绍和使用全面教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Spring注解@Value及属性加载配置文件方式

    Spring注解@Value及属性加载配置文件方式

    这篇文章主要介绍了Spring注解@Value及属性加载配置文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论