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 实现一个汉诺塔实战练习

    汉诺塔是源于印度一个古老传说的益智玩具。大梵天创造世界时做了三根石柱,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,三根柱子之间一次只能移动一个圆盘
    2021-10-10
  • java实现两台服务器间文件复制的方法

    java实现两台服务器间文件复制的方法

    这篇文章主要介绍了java实现两台服务器间文件复制的方法,是对单台服务器上文件复制功能的升级与改进,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • Spring中Bean扫描原理详情

    Spring中Bean扫描原理详情

    这篇文章主要介绍了Spring中Bean扫描原理详情,文章为荣啊主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 解决IDEA中不能正常输入光标变粗的问题

    解决IDEA中不能正常输入光标变粗的问题

    这篇文章主要介绍了在IDEA中不能正常输入光标变粗的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09
  • 解决SpringBoot项目读取yml文件中值为中文时,在视图页面显示乱码

    解决SpringBoot项目读取yml文件中值为中文时,在视图页面显示乱码

    这篇文章主要介绍了解决SpringBoot项目读取yml文件中值为中文时,在视图页面显示乱码的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • SpringCloud Feign原理剖析

    SpringCloud Feign原理剖析

    feign是用在微服务中,各个微服务间的调用,它是通过声明式的方式来定义接口,而不用实现接口,feign让服务间的调用变得简单,不用各个服务去处理http client相关的逻辑,本文详细介绍SpringCloud Feign原理,需要的朋友可以参考下
    2023-06-06
  • 详解Java多线程编程中互斥锁ReentrantLock类的用法

    详解Java多线程编程中互斥锁ReentrantLock类的用法

    Java多线程并发的程序中使用互斥锁有synchronized和ReentrantLock两种方式,这里我们来详解Java多线程编程中互斥锁ReentrantLock类的用法:
    2016-07-07
  • java向文件末尾添加内容示例分享

    java向文件末尾添加内容示例分享

    本文为大家提供一个java向文件末尾添加内容的示例分享,大家参考使用吧
    2014-01-01
  • SpringBoot实现定时任务和异步调用

    SpringBoot实现定时任务和异步调用

    这篇文章主要为大家详细介绍了SpringBoot实现定时任务和异步调用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • SpringBoot集成Swagger2实现Restful(类型转换错误解决办法)

    SpringBoot集成Swagger2实现Restful(类型转换错误解决办法)

    这篇文章主要介绍了SpringBoot集成Swagger2实现Restful(类型转换错误解决办法),需要的朋友可以参考下
    2017-07-07

最新评论