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");
利用这个方法,可以直接拿到枚举类 某一条对象的集合
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
