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");

利用这个方法,可以直接拿到枚举类 某一条对象的集合

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java常用集合之Set和Map的用法详解

    Java常用集合之Set和Map的用法详解

    这篇文章将通过一些示例为大家详细介绍一下Java常用集合中Set和Map的用法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-07-07
  • SpringBoot 中大文件(分片上传)断点续传与极速秒传功能的实现

    SpringBoot 中大文件(分片上传)断点续传与极速秒传功能的实现

    这篇文章主要介绍了SpringBoot 中大文件(分片上传)断点续传与极速秒传功能的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • java使用RandomAccessFile类基于指针读写文件实例代码

    java使用RandomAccessFile类基于指针读写文件实例代码

    这篇文章主要介绍了java使用RandomAccessFile类基于指针读写文件实例代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • springboot实现微信扫码登录的项目实践

    springboot实现微信扫码登录的项目实践

    微信扫码功能是目前第三方登录常见功能,前不久有个项目刚好用上,本文主要介绍了springboot实现微信扫码登录的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Java实现提取QSV文件视频内容

    Java实现提取QSV文件视频内容

    QSV是一种加密的视频文件格式。是爱奇艺公司研发的一种视频文件格式,这篇文章主要为大家介绍了如何利用Java实现提取QSV文件视频内容,感兴趣的可以了解一下
    2023-03-03
  • Java中Integer和int的区别解读

    Java中Integer和int的区别解读

    这篇文章主要介绍了Java中Integer和int的区别解读,大家都知道他可以表示一个整数,而且也知道可以表示整数的还有int,只是使用Integer的次数要比int多得多,今天我们就来好好探究一下Integer与int的区别以及更深处的知识,需要的朋友可以参考下
    2023-12-12
  • 解决Java Redis删除HashMap中的key踩到的坑

    解决Java Redis删除HashMap中的key踩到的坑

    这篇文章主要介绍了解决Java Redis删除HashMap中的key踩到的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Mybatis plus逻辑删除失败的BUG操作

    Mybatis plus逻辑删除失败的BUG操作

    这篇文章主要介绍了Mybatis plus逻辑删除失败的BUG操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 详解Java中log4j.properties配置与加载应用

    详解Java中log4j.properties配置与加载应用

    这篇文章主要介绍了 log4j.properties配置与加载应用的相关资料,需要的朋友可以参考下
    2018-02-02
  • spring初始化源码之关键类和扩展接口详解

    spring初始化源码之关键类和扩展接口详解

    Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给Spring管理,下面这篇文章主要给大家介绍了关于spring初始化源码之关键类和扩展接口的相关资料,需要的朋友可以参考下
    2023-04-04

最新评论