Java之遍歷枚舉值問題
Java遍歷枚舉值
枚舉是Java中數據類型,用于將一組預定義常量賦給變量。本文介紹幾種方式遍歷枚舉值。
1. 定義枚舉
首先我們定義枚舉,簡單示例如下:
public enum DaysOfWeekEnum { ? ? SUNDAY, ? ? MONDAY, ? ? TUESDAY,? ? ? WEDNESDAY,? ? ? THURSDAY,? ? ? FRIDAY,? ? ? SATURDAY }
Enum類型沒有提供迭代方法,如forEach() 或 iterator(), 我們可以使用其values()方法的返回值。
2. 遍歷枚舉
2.1 使用for循環(huán)
首先使用for循環(huán)實現:
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {? ? ? System.out.println(day);? }
2.2 使用流方式
我們也可以使用java.util.Stream,我們可以在枚舉值上執(zhí)行相應操作創(chuàng)建流:
Stream.of(DaysOfWeekEnum.values());
或者:
Arrays.stream(DaysOfWeekEnum.values());
這里擴展上面的枚舉類,使用流方式實現:
public enum DaysOfWeekEnum { ? ? SUNDAY("off"),? ? ? MONDAY("working"),? ? ? TUESDAY("working"),? ? ? WEDNESDAY("working"),? ? ? THURSDAY("working"),? ? ? FRIDAY("working"),? ? ? SATURDAY("off"); ? ? private String typeOfDay; ? ? DaysOfWeekEnum(String typeOfDay) { ? ? ? ? this.typeOfDay = typeOfDay; ? ? } ? ? // standard getters and setters? ? ? public static Stream<DaysOfWeekEnum> stream() { ? ? ? ? return Stream.Of(DaysOfWeekEnum.values());? ? ? } }
現在寫示例按順序打印非工作日:
public class EnumStreamExample { ? ? public static void main() { ? ? ? ? DaysOfWeekEnum.stream() ? ? ? ? .filter(d -> d.getTypeOfDay().equals("off")) ? ? ? ? .forEach(System.out::println); ? ? } }
輸出:
SUNDAY
SATURDAY
2.3 使用forEach
forEach方法是Java8開始引入,所有集合類都有其實現。
為了在枚舉中使用,首先需要轉換枚舉為集合子類。
我們可以使用Arrays.asList方法生成ArrayList,然后使用forEach方法:
Arrays.asList(DaysOfWeekEnum.values()) ? .forEach(day -> System.out.println(day));
2.4 使用EnumSet
EnumSet是針對枚舉類型的特殊實現:
EnumSet.allOf(DaysOfWeekEnum.class) ? .forEach(day -> System.out.println(day));
2.5 使用枚舉類型的ArrayList
我們可以往List中增加枚舉值,這樣可以按任何順序操作List:
List<DaysOfWeekEnum> days = new ArrayList<>(); days.add(DaysOfWeekEnum.FRIDAY); days.add(DaysOfWeekEnum.SATURDAY); days.add(DaysOfWeekEnum.SUNDAY); for (DaysOfWeekEnum day : days) { ? ? System.out.println(day); } days.remove(DaysOfWeekEnum.SATURDAY); if (!days.contains(DaysOfWeekEnum.SATURDAY)) { ? ? System.out.println("Saturday is no longer in the list"); } for (DaysOfWeekEnum day : days) { ? ? System.out.println(day); }
也可以使用 Arrays.asList()方法創(chuàng)建ArrayList。
但ArrayList底層的枚舉值數組值是不可變的,因此不能對List進行增加或刪除項,否則會拋出異常 UnsupportedOperationException:
List<DaysOfWeekEnum> days = Arrays.asList(DaysOfWeekEnum.values()); days.remove(0);
注意:
我們看到使用多種方式迭代枚舉,forEach,Stream以及for等。
如果需要執(zhí)行并行操作可以使用stream方式,否則幾種方式沒有太多差異。
Java枚舉遍歷(多個類名稱不同,值不同,字段一致)
遇到一個小問題,就是 需要做報表統(tǒng)計,然后自己建立的枚舉名稱都一致,但是每個枚舉集合值不一致,所以
想弄一個專用的方法 ,不用每個枚舉方法都去遍歷,直接傳入class名稱就可以 篩選的方案,最后找資料得出以下方法。
關鍵枚舉方法
//參考EnumExtUtil ?獲取枚舉變量的值 public static <T extends Enum<T>> int getEnumOnValue(Class<T> enumType, int value) throws Exception { ? ? for (Object obj : enumType.getEnumConstants()) { ? ? ? ? Method m = obj.getClass().getDeclaredMethod("getHigh", null); ? ? ? ? int highscore = (int) m.invoke(obj, null); ? ? ? ? m = obj.getClass().getDeclaredMethod("getLower", null); ? ? ? ? int lowerScore = (int) m.invoke(obj, null); ? ? ? ? m = obj.getClass().getDeclaredMethod("getScore", null); ? ? ? ? int score = (int) m.invoke(obj, null); ? ? ? ? if (value == -1 && lowerScore == -1) { ? ? ? ? ? ? return score; ? ? ? ? } ? ? ? ? if (value > lowerScore && value <= highscore) { ? ? ? ? ? ? return score; ? ? ? ? } ? ? } ? ? return 0; }
枚舉類
enum UnionpayEnums { ? ? weirenzheng(1, "0、未認證;", 16, -1, 0), ? ? onceTime(2, "上月支付1次及以下;", 8, 0, 1), ? ? towTimes(3, "上月支付1-2次", 12, 1, 2), ? ? threeTimes(4, "上月支付3-4次;", 16, 3, 4), ? ? fiveTimes(5, "上月支付5-7次", 20, 4, 7), ? ? sixTimes(6, "上月支付7次以上", 24, 7, Integer.MAX_VALUE); ? ? private int code;//排序 ? ? private String desc;//描述 ? ? private int score;//分值 ? ? private int lower;//最低次數 ? ? private int high;//最高次數 ? ? UnionpayEnums() { ? ? } ? ? UnionpayEnums(int code, String desc, int score, int lower, int high) { ? ? ? ? this.code = code; ? ? ? ? this.desc = desc; ? ? ? ? this.score = score; ? ? ? ? this.lower = lower; ? ? ? ? this.high = high; ? ? } ? ? public int getCode() { ? ? ? ? return code; ? ? } ? ? public void setCode(int code) { ? ? ? ? this.code = code; ? ? } ? ? public String getDesc() { ? ? ? ? return desc; ? ? } ? ? public void setDesc(String desc) { ? ? ? ? this.desc = desc; ? ? } ? ? public int getScore() { ? ? ? ? return score; ? ? } ? ? public void setScore(int score) { ? ? ? ? this.score = score; ? ? } ? ? public int getLower() { ? ? ? ? return lower; ? ? } ? ? public void setLower(int lower) { ? ? ? ? this.lower = lower; ? ? } ? ? public int getHigh() { ? ? ? ? return high; ? ? } ? ? public void setHigh(int high) { ? ? ? ? this.high = high; ? ? } }
方法內遍歷枚舉
public ?int scores(){ ? ? for (UnionpayEnums upay:UnionpayEnums.values()){ ? ? ? ? int score ?=upay.getScore(); ? ? } }
拓展
//傳入方法名稱 ?values是值 ,field是 字段mingcheng public static <T extends Enum<T>> T getEnumOnValue(Class<T> enumType, String value, String field) throws Exception { ? ?for (Object obj : enumType.getEnumConstants()) { ? ? ? Method m = obj.getClass().getDeclaredMethod("values", null); ? ? ? Object[] results = (Object[]) m.invoke(obj, null); ? ? ? for (Object result : results) { ? ? ? ? ?Field codeField = result.getClass().getDeclaredField(field); ? ? ? ? ?ReflectionUtils.makeAccessible(codeField); ? ? ? ? ?String fileValue = String.valueOf(ReflectionUtils.getField(codeField, result)); ? ? ? ? ?if (fileValue.equals(value)) { ? ? ? ? ? ? return (T) result; ? ? ? ? ?} ? ? ? } ? ?} ? ?return null; }
AbilityEnum abilityEnum = EnumExtUtil.getEnumOnValue(AbilityEnum.class, String.valueOf(maxAbility.getAbilityId()), "code");
利用這個方法,可以直接拿到枚舉類 某一條對象的集合
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java for-each循環(huán)使用難題2例(高級使用方法)
從Java5起,在Java中有了for-each循環(huán),可以用來循環(huán)遍歷collection和array。For each循環(huán)允許你在無需保持傳統(tǒng)for循環(huán)中的索引,或在使用iterator /ListIterator時無需調用while循環(huán)中的hasNext()方法就能遍歷collection2014-04-04SpringMVC空指針異常NullPointerException解決及原理解析
這篇文章主要介紹了SpringMVC空指針異常NullPointerException解決及原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08