最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java之遍歷枚舉值問題

 更新時間:2023年07月24日 15:23:58   作者:夢想畫家  
這篇文章主要介紹了Java之遍歷枚舉值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java遍歷枚舉值

枚舉是Java中數(shù)據(jù)類型,用于將一組預(yù)定義常量賦給變量。本文介紹幾種方式遍歷枚舉值。

1. 定義枚舉

首先我們定義枚舉,簡單示例如下:

public enum DaysOfWeekEnum {
? ? SUNDAY,
? ? MONDAY,
? ? TUESDAY,?
? ? WEDNESDAY,?
? ? THURSDAY,?
? ? FRIDAY,?
? ? SATURDAY
}

Enum類型沒有提供迭代方法,如forEach() 或 iterator(), 我們可以使用其values()方法的返回值。

2. 遍歷枚舉

2.1 使用for循環(huán)

首先使用for循環(huán)實現(xiàn):

for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {?
? ? System.out.println(day);?
}

2.2 使用流方式

我們也可以使用java.util.Stream,我們可以在枚舉值上執(zhí)行相應(yīng)操作創(chuàng)建流:

Stream.of(DaysOfWeekEnum.values());

或者:

Arrays.stream(DaysOfWeekEnum.values());

這里擴展上面的枚舉類,使用流方式實現(xiàn):

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());?
? ? }
}

現(xiàn)在寫示例按順序打印非工作日:

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開始引入,所有集合類都有其實現(xiàn)。

為了在枚舉中使用,首先需要轉(zhuǎn)換枚舉為集合子類。

我們可以使用Arrays.asList方法生成ArrayList,然后使用forEach方法:

Arrays.asList(DaysOfWeekEnum.values())
? .forEach(day -> System.out.println(day));

2.4 使用EnumSet

EnumSet是針對枚舉類型的特殊實現(xiàn):

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()方法創(chuàng)建ArrayList。

但ArrayList底層的枚舉值數(shù)組值是不可變的,因此不能對List進行增加或刪除項,否則會拋出異常 UnsupportedOperationException:

List<DaysOfWeekEnum> days = Arrays.asList(DaysOfWeekEnum.values());
days.remove(0);

注意:

我們看到使用多種方式迭代枚舉,forEach,Stream以及for等。

如果需要執(zhí)行并行操作可以使用stream方式,否則幾種方式?jīng)]有太多差異。

Java枚舉遍歷(多個類名稱不同,值不同,字段一致)

遇到一個小問題,就是 需要做報表統(tǒng)計,然后自己建立的枚舉名稱都一致,但是每個枚舉集合值不一致,所以

想弄一個專用的方法 ,不用每個枚舉方法都去遍歷,直接傳入class名稱就可以 篩選的方案,最后找資料得出以下方法。

關(guān)鍵枚舉方法

//參考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、未認(rèn)證;", 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;//最低次數(shù)
? ? private int high;//最高次數(shù)
? ? 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;
? ? }
}

方法內(nèi)遍歷枚舉

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

利用這個方法,可以直接拿到枚舉類 某一條對象的集合

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于SpringBoot實現(xiàn)QQ郵箱驗證碼注冊功能

    基于SpringBoot實現(xiàn)QQ郵箱驗證碼注冊功能

    QQ 郵箱是由騰訊公司推出的一款免費郵箱服務(wù),它提供了完整的郵件發(fā)送和接收功能,并且還支持多種郵件格式和附件類型,QQ 郵箱還具有強大的反垃圾郵件功能,可以有效地過濾垃圾郵件,并保護用戶隱私和安全,所以本文給大家介紹了基于SpringBoot實現(xiàn)QQ郵箱驗證碼注冊功能
    2024-11-11
  • SpringBoot Hutool各種用法示例小結(jié)

    SpringBoot Hutool各種用法示例小結(jié)

    文章介紹了Hutool庫的使用,包括生成隨機數(shù)、對象信息過濾、生成UUID、MD5加密、JSON序列化和字段檢驗等功能,并提供了詳細的用法示例,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Java項目啟動成功、失敗信息實時反饋提醒問題(郵件或者短信)

    Java項目啟動成功、失敗信息實時反饋提醒問題(郵件或者短信)

    這篇文章主要介紹了Java項目啟動成功、失敗信息實時反饋提醒問題(郵件或者短信),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 簡單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別

    簡單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別

    這篇文章主要介紹了簡單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • 使用ScheduledThreadPoolExecutor踩過最痛的坑

    使用ScheduledThreadPoolExecutor踩過最痛的坑

    這篇文章主要介紹了使用ScheduledThreadPoolExecutor踩過最痛的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java中LinkedHashSet的實現(xiàn)原理詳解

    Java中LinkedHashSet的實現(xiàn)原理詳解

    這篇文章主要介紹了Java中LinkedHasSet的實現(xiàn)原理詳解,LinkedHashSet?是具有可預(yù)知迭代順序的?Set?接口的哈希表和鏈接列表實現(xiàn),此實現(xiàn)與HashSet?的不同之處在于,后者維護著一個運行于所有條目的雙重鏈接列表,需要的朋友可以參考下
    2023-09-09
  • 實例分析java對象中淺克隆和深克隆

    實例分析java對象中淺克隆和深克隆

    在本篇文章中我們給大家分享了關(guān)于java對象中淺克隆和深克隆的相關(guān)知識點和相關(guān)代碼內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2018-10-10
  • springboot集成es詳解

    springboot集成es詳解

    這篇文章主要介紹了springboot集成es,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java字節(jié)流與基本數(shù)據(jù)類型的轉(zhuǎn)換實例

    Java字節(jié)流與基本數(shù)據(jù)類型的轉(zhuǎn)換實例

    本篇文章主要介紹了Java字節(jié)流與基本數(shù)據(jù)類型的轉(zhuǎn)換實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • java  HashMap和HashTable的區(qū)別詳解

    java HashMap和HashTable的區(qū)別詳解

    這篇文章主要介紹了java HashMap和HashTable的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12

最新評論

三门县| 收藏| 沾益县| 扎囊县| 景宁| 珠海市| 新绛县| 赞皇县| 沙湾县| 罗定市| 长岛县| 克山县| 甘谷县| 锡林郭勒盟| 微博| 德庆县| 阜南县| 麻城市| 宁城县| 英德市| 巨鹿县| 靖边县| 岗巴县| 神农架林区| 咸丰县| 本溪| 丁青县| 江山市| 东丽区| 天长市| 册亨县| 德化县| 白银市| 赤壁市| 阳新县| 安远县| 五家渠市| 喀喇沁旗| 伊吾县| 南华县| 汉阴县|