欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java讀取枚舉類的值轉(zhuǎn)成list和map方式

 更新時間:2023年07月24日 14:29:47   作者:不寫bug的程序媛  
這篇文章主要介紹了java讀取枚舉類的值轉(zhuǎn)成list和map方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java讀取枚舉類的值轉(zhuǎn)成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);?
? ? /**
? ? ?* ?把枚舉類的值都轉(zhuǎn)成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;
? ? ? ? /**默認(rèn)接口key方法*/
? ? ? ? String keyMathod = "getReason";
? ? ? ? /**默認(rèn)接口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("枚舉類轉(zhuǎn)成Map異常",e);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return enummap;
? ? }
? ? private static <T> Object getMethodValue(String methodName, T obj, Object... args) {
? ? ? ? Object resut = "";
? ? ? ? try {
? ? ? ? ? ? /********************************* start *****************************************/
? ? ? ? ? ? /**獲取方法數(shù)組,這里只要公有的方法*/
? ? ? ? ? ? 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;
? ? ? ? ? ? }
? ? ? ? ? ? /**方法執(zhí)行*/
? ? ? ? ? ? resut = method.invoke(obj, args);
? ? ? ? ? ? if (resut == null) {
? ? ? ? ? ? ? ? resut = "";
? ? ? ? ? ? }
? ? ? ? ? ? /**返回結(jié)果*/
? ? ? ? ? ? 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) { ?//如果沒有枚舉鍵和值 ? 結(jié)束
? ? ? ? ? ? return enumList;
? ? ? ? }
? ? ? ? int count = methodNames.length;
? ? ? ? String keyMethod = "getReason"; ?//默認(rèn)的取 key的方法
? ? ? ? String valueMethod = "getIndex"; ?//默認(rèn)的取 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("枚舉類轉(zhuǎn)成List異常", e);
? ? ? ? }
? ? ? ? return enumList;
? ? }
}

下面是調(diào)用的方法

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

完美~

通用java枚舉類轉(zhuǎn)List-Map集合

java的枚舉類功能是很強大的,在平時開發(fā)中也用的比較多,有時候可能會有將枚舉類轉(zhuǎn)成List集合這種需求,如果能確定枚舉類中的字段固定可以使用實體類接收,如果不固定的話,很多時候只能用Map來接收了。

這里實現(xiàn)一下java枚舉類轉(zhuǎn)List-Map集合

?? ?/**
? ? ?* java枚舉類轉(zhuǎn)List<Map>集合
? ? ?*?
? ? ?* @param clazz
? ? ?* @return null-該class不是枚舉類型 ?[]-該枚舉類型沒有自定義字段 ?list-獲取該枚舉類型的List<Map>返回結(jié)果
? ? ?*/
? ? 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));
    }

運行結(jié)果:

null
[]
[{name=TestEnum2}]
[{id=1, message=TestEnum3, desc=測試枚舉類}]

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java快速入門掌握類與對象及變量的使用

    Java快速入門掌握類與對象及變量的使用

    類和對象是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲在內(nèi)存中—個可以擁有在某個范圍內(nèi)的可變存儲區(qū)域
    2022-04-04
  • Java中如何讀取和寫入zip文件問題

    Java中如何讀取和寫入zip文件問題

    這篇文章主要介紹了Java中如何讀取和寫入zip文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • spring本地事務(wù)失效的原因分析

    spring本地事務(wù)失效的原因分析

    這篇文章給大家介紹了spring本地事務(wù)失效的情況原因分析,給大家羅列了五種原因分析,通過代碼示例介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-10-10
  • java圖形化界面實現(xiàn)登錄窗口

    java圖形化界面實現(xiàn)登錄窗口

    這篇文章主要為大家詳細(xì)介紹了java圖形化界面實現(xiàn)登錄窗口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • mybatis攔截器注冊初始化編寫示例及如何生效詳解

    mybatis攔截器注冊初始化編寫示例及如何生效詳解

    這篇文章主要為大家介紹了mybatis攔截器注冊初始化編寫示例及如何生效詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • SpringAOP中的注解配置詳解

    SpringAOP中的注解配置詳解

    這篇文章主要介紹了SpringAOP中的注解配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • java外部類與內(nèi)部類的關(guān)系詳解

    java外部類與內(nèi)部類的關(guān)系詳解

    本文詳細(xì)講解了java外部類與內(nèi)部類的關(guān)系,用代碼演示了外部類調(diào)用內(nèi)部類的方法。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • CompletableFuture創(chuàng)建及功能使用全面詳解

    CompletableFuture創(chuàng)建及功能使用全面詳解

    這篇文章主要為大家介紹了CompletableFuture創(chuàng)建及功能使用全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • java List集合接口的介紹和使用全面教程

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

    這篇文章主要為大家介紹了java List集合接口的介紹和使用全面教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Spring注解@Value及屬性加載配置文件方式

    Spring注解@Value及屬性加載配置文件方式

    這篇文章主要介紹了Spring注解@Value及屬性加載配置文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論