Java之遍历枚举值问题

 更新时间:2023年07月24日 15:23:58   作者:梦想画家  
这篇文章主要介绍了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获取参数名和值

    这篇文章主要介绍了SpringAOP 通过JoinPoint获取参数名和值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Springboot结合Flowable实现工作流开发

    Springboot结合Flowable实现工作流开发

    本文主要介绍了Springboot结合Flowable实现工作流开发,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 如何用Netty实现高效的HTTP服务器

    如何用Netty实现高效的HTTP服务器

    这篇文章主要介绍了如何用Netty实现高效的HTTP服务器,对HTTP感兴趣的同学可以参考一下
    2021-04-04
  • MyBatisPlus查询投影与查询条件详细讲解

    MyBatisPlus查询投影与查询条件详细讲解

    这篇文章主要介绍了MyBatisPlus DQL编程控制中的查询投影、查询条件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java中的HttpServletRequestWrapper用法解析

    Java中的HttpServletRequestWrapper用法解析

    这篇文章主要介绍了Java中的HttpServletRequestWrapper用法解析,HttpServletRequest 对参数值的获取实际调的是org.apache.catalina.connector.Request,没有提供对应的set方法修改属性,所以不能对前端传来的参数进行修改,需要的朋友可以参考下
    2024-01-01
  • SpringBoot创建自定义starter详解

    SpringBoot创建自定义starter详解

    这篇文章主要介绍了SpringBoot创建自定义starter详解,Starter是Spring Boot中的一个非常重要的概念,Starter相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境(条件)进行自动配置,需要的朋友可以参考下
    2024-01-01
  • Java垃圾回收机制的finalize方法实例分析

    Java垃圾回收机制的finalize方法实例分析

    这篇文章主要介绍了Java垃圾回收机制的finalize方法,结合实例形式分析了finalize方法的特点及在垃圾回收机制中的相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • springboot使用JdbcTemplate完成对数据库的增删改查功能

    springboot使用JdbcTemplate完成对数据库的增删改查功能

    这篇文章主要介绍了springboot使用JdbcTemplate完成对数据库的增删改查功能,需要的朋友可以参考下
    2017-12-12
  • 通过实例了解Java jdk和jre的区别

    通过实例了解Java jdk和jre的区别

    这篇文章主要介绍了通过实例了解Java jdk和jre的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Spring Boot2配置Swagger2生成API接口文档详情

    Spring Boot2配置Swagger2生成API接口文档详情

    这篇文章主要介绍了Spring Boot2配置Swagger2生成API接口文档详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论