首页 > 编程语言 >java enum 对标 .net 的enum [Flags]

java enum 对标 .net 的enum [Flags]

时间:2022-11-23 03:22:18浏览次数:40  
标签:index DemoEnum return int enum 枚举 Flags net public

一、前景

C#中的枚举中我们使用[Flags]来对枚举进行 |(与) 运算,比如这样:DemoEnum demoEnum = DemoEnum.One|DemoEnum.Two;
然后我们在使用的过程中,可以对 demoEnum.HasFlag(DemoEnum.Two)进行验证是否包含 Demo.Two 枚举值,但是JAVA中不支持枚举间的 与 运算,so 当前文章就诞生了。

二、枚举样例Demo

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 星期
 */
public enum DemoEnum {
    one("周一", 1),
    two("周二", 2),
    three("周三", 4),
    four("周四", 8),
    five("周五", 16),
    six("周六", 32),
    seven("周日", 64);

    /**
     * 名称
     */
    private String weekDayName;
    /**
     * 索引
     */
    private int index;

    /**
     * 当前星期状态键值对
     */
    private static final Map<Integer, DemoEnum> weekStateMap = Arrays.stream(DemoEnum.values()).collect(Collectors.toMap(DemoEnum::getIndex, v -> v));

    DemoEnum(String name, int index) {
        this.weekDayName = name;
        this.index = index;
    }

    public String getWeekDayName() {
        return weekDayName;
    }

    public void setWeekDayName(String weekDayName) {
        this.weekDayName = weekDayName;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public DemoEnum indexOf(int index) {
        return weekStateMap.get(index);
    }

    /**
     * 根据提供的枚举值,获取该值中包含的所有枚举对象(拆分枚举合计值为枚举列表)
     *
     * @param value 提供查询的枚举值(供拆分的枚举合计值,由一个或多个枚举index相加的值)
     * @return 返回符合条件的枚举列表
     */
    public static List<DemoEnum> getWeeks(int value) {
        List<DemoEnum> result = new ArrayList<>();
        if (weekStateMap.containsKey(value)) {
            result.add(weekStateMap.get(value));
            return result;
        }
        int currentValue = value;
        do {
            final int tempValue = currentValue;
            int maxValue = weekStateMap.keySet().stream().filter(f -> f <= tempValue).max(Integer::compare).get();
            result.add(weekStateMap.get(maxValue));
            currentValue -= maxValue;
        } while (currentValue > 0);
        return result;
    }

    /**
     * 检查当前枚举值是否在选中枚举列表中存在
     *
     * @param weekDayTotalValue 已选中枚举列表合计值(由一个或多个枚举index相加的值)
     * @param weekDayValue      待验证的枚举值(单个枚举index值,支持多个)
     * @return 返回验证枚举值是否在选中列表中
     */
    public static boolean hasWeekDay(int weekDayTotalValue, int weekDayValue) {
        if (!weekStateMap.containsKey(weekDayValue)) {
            System.out.println("暂时不支持多个枚举包含,若有需要加上也简单。。。");
            return false;
        }else {
            int currentValue = weekDayTotalValue;
            int maxValue = 0;
            do {
                final int tempValue = currentValue;
                maxValue = weekStateMap.keySet().stream().filter(f -> f <= tempValue).max(Integer::compare).get();
                if (maxValue == weekDayValue)
                    return true;
                currentValue -= maxValue;
            } while (currentValue > 0);
        }
        return false;
    }

    @Override
    public String toString() {
        return weekDayName;
    }
}

三、测试代码

    public static void main(String[] args) throws Exception {
        //工作日设置
        int weekDayTotal = DemoEnum.one.getIndex()|DemoEnum.two.getIndex()|DemoEnum.three.getIndex()|DemoEnum.four.getIndex()|DemoEnum.five.getIndex();
        //根据工作日,获取工作日集合
        List<DemoEnum> weeks = DemoEnum.getWeeks(weekDayTotal);
        System.out.println("设置的工作日如下:");
        for(DemoEnum week: weeks){
            System.out.println(week);
        }
        System.out.println("================================");
        DemoEnum week = DemoEnum.one;
        System.out.println(week+"是否在设置的工作日中?");
        System.out.println(DemoEnum.hasWeekDay(weekDayTotal,week.getIndex()));
        week = DemoEnum.six;
        System.out.println(week+"是否在设置的工作日中?");
        System.out.println(DemoEnum.hasWeekDay(weekDayTotal,week.getIndex()));
}

输出结果:

设置的工作日如下:
周五
周四
周三
周二
周一
================================
周一是否在设置的工作日中?
true
周六是否在设置的工作日中?
false

标签:index,DemoEnum,return,int,enum,枚举,Flags,net,public
From: https://www.cnblogs.com/JalanWang/p/16917069.html

相关文章

  • ASP.NET Core 6.0 添加 JWT 认证和授权
    原文:http://www.manongjc.com/detail/29-dtuskmzuwjitnoh.html本文章向大家介绍ASP.NETCore6.0添加JWT认证和授权,主要包括ASP.NETCore6.0添加JWT认证和授权使用......
  • 聊聊如何让办公网络直连Kubernetes集群PodIP/ClusterIP/Service DNS等
    想象一下,如果您日常使用的研发测试Kubernetes集群,能够有以下效果:在办公网络下直接访问PodIP在办公网络下直接访问ServiceClusterIP在办公网络下直接访问集群内部域......
  • 网络爬虫-DeepNet爬虫
    DeepNet爬虫DeepWeb是相对于SurfaceWeb和DarkWeb而言的,是互联网页面的几种形态。DeepWeb指存储在网络数据库里,不能通过超链接访问而需要动态网页技术访问的资源集合......
  • Kubernetes_静态Pod网关apiserver的audit审计日志
    前言审计日志是kube-apiserver中比较常见的一种加固手段,通过对每一次请求的行为进行审计,从而达到加固集群的目的,同时,审计日志还能够帮助我们troubleshooting,因为每一次......
  • asp.net core mvc异常处理
    过滤器处理异常publicclassGlobalExceptionFilter:IExceptionFilter{privateILogger_logger;publicGlobalExceptionFilter(ILoggerlogger){_logger=logger......
  • Going Deeper with Embedded FPGA Platform for Convolutional Neural Network
    题目:GoingDeeperwithEmbeddedFPGAPlatformforConvolutionalNeuralNetwork日期&会议:Proceedingsofthe2016ACM/SIGDAInternationalSymposiumonField-Prog......
  • PyTorch复现GoogleNet学习笔记
    PyTorch复现GoogleNet学习笔记一篇简单的学习笔记,实现五类花分类,这里只介绍复现的一些细节如果想了解更多有关网络的细节,请去看论文《GoingDeeperwithConvolutions》......
  • 求超大文件上传方案( asp.net )
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持......
  • Profinet总线模块与西门子通信
    准备IO模块:耦合器BL200PN、数字量输出模块M2082、数字量输入M1081、模拟量输入模块M3401、模拟量输出M4043。2、BL200PN、S7-1200、PC要同一局域网。将BL200PN和......
  • CentOS7没有telnet命令的解决方法
    文章目录​​1、找到telnet命令所在的软件包​​​​2、安装telnet软件包​​​​3、验证​​​​4、获取视频教程​​​​5、文章版权​​在CentOS中,输入telnet命令,提示com......