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");
利用这个方法,可以直接拿到枚举类 某一条对象的集合
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringAOP 如何通过JoinPoint获取参数名和值
这篇文章主要介绍了SpringAOP 通过JoinPoint获取参数名和值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06Java中的HttpServletRequestWrapper用法解析
这篇文章主要介绍了Java中的HttpServletRequestWrapper用法解析,HttpServletRequest 对参数值的获取实际调的是org.apache.catalina.connector.Request,没有提供对应的set方法修改属性,所以不能对前端传来的参数进行修改,需要的朋友可以参考下2024-01-01springboot使用JdbcTemplate完成对数据库的增删改查功能
这篇文章主要介绍了springboot使用JdbcTemplate完成对数据库的增删改查功能,需要的朋友可以参考下2017-12-12Spring Boot2配置Swagger2生成API接口文档详情
这篇文章主要介绍了Spring Boot2配置Swagger2生成API接口文档详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下2022-09-09
最新评论