Java之遍历枚举值问题
作者:梦想画家
Java遍历枚举值
枚举是Java中数据类型,用于将一组预定义常量赋给变量。本文介绍几种方式遍历枚举值。
1. 定义枚举
首先我们定义枚举,简单示例如下:
public enum DaysOfWeekEnum { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }
Enum类型没有提供迭代方法,如forEach() 或 iterator(), 我们可以使用其values()方法的返回值。
2. 遍历枚举
2.1 使用for循环
首先使用for循环实现:
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) { System.out.println(day); }
2.2 使用流方式
我们也可以使用java.util.Stream,我们可以在枚举值上执行相应操作创建流:
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()方法创建ArrayList。
但ArrayList底层的枚举值数组值是不可变的,因此不能对List进行增加或删除项,否则会抛出异常 UnsupportedOperationException:
List<DaysOfWeekEnum> days = Arrays.asList(DaysOfWeekEnum.values()); days.remove(0);
注意:
我们看到使用多种方式迭代枚举,forEach,Stream以及for等。
如果需要执行并行操作可以使用stream方式,否则几种方式没有太多差异。
Java枚举遍历(多个类名称不同,值不同,字段一致)
遇到一个小问题,就是 需要做报表统计,然后自己建立的枚举名称都一致,但是每个枚举集合值不一致,所以
想弄一个专用的方法 ,不用每个枚举方法都去遍历,直接传入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");
利用这个方法,可以直接拿到枚举类 某一条对象的集合
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。