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)文章
CompletableFuture創(chuàng)建及功能使用全面詳解
這篇文章主要為大家介紹了CompletableFuture創(chuàng)建及功能使用全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07