java 设置两个方法互斥_分享两个操作Java枚举的实用方法

ca7a34e399bec412f706428bda58f54b.gif

1. 前言

Java枚举在开发中是非常实用的。今天再来分析几个小技巧并且回答一些同学的的疑问。首先要说明的是我的枚举建立在以下的范式之中:

5b410af00bc5a35a6836f4754bb1ef1f.png
枚举统一接口范式

2. 如何把枚举值绑定的下拉列表

这种场景非常常见,如果你把状态、类别等属性封装成枚举的结构,就像下面一样,一个标识对应一个状态,这是典型的下拉列表结构。

public enum EnabledEnum implements Enumerator {
    /**
     * Disable status enum.
     */
    DISABLE(0, "不可用"),
    /**
     * Enable status enum.
     */
    ENABLE(1, "可用");

    private final int value;
    private final String description;

    EnabledEnum(int value, String description) {
        this.value = value;
        this.description = description;
    }

    @Override
    public int value() {
        return this.value;
    }

    @Override
    public String description() {
        return this.description;
    }
}

前端希望能够获取这些状态作为下拉列表的填充,你该如何解析封装它呢?这里我有两个办法,第一个你可以从JSON 类库 Jackson 优雅序列化 Java 枚举类一文获得解决方案;第二种更加简单一些,写一个工具类就可以了。

public static  & Enumerator> Map enumToMap(Class clazz) {
    E[] enumConstants = clazz.getEnumConstants();
    Map map = new LinkedHashMap<>();for (E e : enumConstants) {
        map.put(e.value(), e.description());
    }return map;
}

这里用了Java 8的新特性附加约束。也就是说extends后面可以在通过&符号附加额外约束,可以重复使用,注意必须为接口类型,不能为抽象类或者其他Class。表示泛型的上界受到多个约束的制约。 & Enumerator>可以解读为E必须为一个枚举类而且同时还必须实现Enumerator接口。

为什么实现Enumerator接口?第一个好处是可以规定统一的范式;第二个好处是解析的时候不用转换了。

此外我尝试用Stream来封装,但是发现过于复杂了,虽然成功了但是有点难以理解,这里也分享一下:

public static  & Enumerator> Map enumToOptions(Class enumClazz){// 合并时检查 key 是否重复
    BinaryOperator merge = (u, v) -> {throw new IllegalStateException(String.format("Duplicate key %s", u));
    };
    Enumerator[] enumConstants = enumClazz.getEnumConstants();return Stream.of(enumConstants)
          .collect(Collectors.toMap(Enumerator::value,
                  Enumerator::description,
                  merge,LinkedHashMap::new));
}

3. 如何根据值找到枚举

这种也很常见,最直接的方式是写一个switch语句。但是每个类都写一个就非常繁琐。所以这个也可以写一个工具类,这次用Stream就简单的多了。

public static  & Enumerator> Optional getEnumByValue(Class enumClazz, final Integer value){return Stream.of(enumClazz.getEnumConstants())
            .filter(enumerator -> Objects.equals(enumerator.code(),value))
            .findAny();
}

返回Optional是因为有可能给出的value没有对应的枚举。

4. 总结

今天分享了两个小工具类来操作枚举,不光运用了枚举的一些知识,同时也使用了Java 8的三个新特性:泛型附加约束OptionalStream API。这些知识点以往我都分享过,有兴趣的可以到 felord.cn 搜索一下。如果你有更好的办法可以留言讨论。多多关注:码农小胖哥,更多原创干货分享。

d5e79c7997132bb2e940dd1d68b1d7e7.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序正确的异步request请求,根据经纬度获取地理位置信息

微信小程序的所有request请求都是异步的&#xff0c;不支持同步。但是在请求时可能会耗费一定时间&#xff0c;这样的话在获取返回数据时可能方法还没有执行完就已经进行赋值操作了。我遇到的就是拿到的数据为undefined。 解决办法&#xff0c;使用回调函数&#xff0c;等操作完…

Spring管理的交易说明-第2部分(JPA)

在本系列的第一部分中 &#xff0c;我展示了事务如何在普通JDBC中工作 。 然后&#xff0c;我展示了Spring如何管理基于JDBC的事务。 在本系列的第二部分中&#xff0c;我将首先展示事务如何在普通的JPA中工作。 然后展示Spring如何管理基于JPA的事务。 资金转移 为了帮助说明…

oracle_sqlserver和mysql获取表外键的方法_mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结...

mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结1. MYSQL数据库1) 创建索引CREATE INDEX index_name ON table_name(column_list)CREATE UNIQUE INDEX index_name ON table_name(column_list)修改表的方式添加索引ALTER TABLE table_name ADD INDEX in…

CCC数字钥匙设计【BLE】--车主配对之BLE OOB配对

本文主要介绍CCC3.0采用BLE进行车主配对时&#xff0c;关于蓝牙OOB配对的内容。 首先&#xff0c;介绍下BLE Pairing的一些基础知识&#xff0c;有一些基本概念。之后&#xff0c;再着重介绍CCC规范定义的BLE OOB配对流程。 1、BLE Pairing基础知识 下面先简单介绍下BLE 5.0协…

mysql 重置密码模式_mysql--重置密码

解决Mysql忘记密码&#xff1a;1、首先停止正在运行的MySQL进程&#xff1a;[rootcml5 ~]# systemctl stop mysqld2、以安全模式启动MySQL&#xff1a;[rootcml5 ~]# /usr/local/mysql/bin/mysqld_safe--skip-grant-tables &##或者在my.cnf文件下添加&#xff0c;执行完后就…

Java EE 8中的MVC 1.0:使用Facelets入门

MVC 1.0是一个基于动作的Model-View-Controller Web框架&#xff0c;它将成为将来的Java EE 8的一部分。它将与基于组件的JSF框架并存&#xff0c;并提供构建面向HTML javascript的应用程序的替代方法完全控制网址。 这篇文章总结了使用Facelets代替默认的JSP作为MVC框架的视…

Linux 查看内存状态

# 查看系统内存 命令&#xff1a;free 注&#xff1a;默认k单位显示注&#xff1a;-m 以MB注&#xff1a;-g以GB 单位显示total used free shared buffers cached Mem: 497 463 33 0 13 124 -/ buffe…

python通用数据库连接_python连接数据库的几种方式!

# -*- coding: utf-8 -*-"""-------------------------------------------------File Name&#xff1a; Database.pyAuthor : LiSenDate&#xff1a; 2018/6/26 15:51:-------------------------------------------------"""database两个库&…

Altium Designer导入pcb原件之后都是绿的

转载于:https://www.cnblogs.com/chulin/p/8342041.html

中文文本校对源码java_文字校对应该怎么校对?

如果现在给你一篇纸质文档&#xff0c;老板让你把它做成电子版的&#xff0c;这应该不是啥难事&#xff0c;你做完之后要校验一下&#xff0c;于是你一边看纸质文档一边看电子文档很努力的校对&#xff0c;恩&#xff0c;好像没有什么问题。如果老板给你100篇这样的文档&#x…

EL表达式的11隐含对象

EL表达式在不同范围如何取值&#xff1a; <%pageContext.setAttribute("book", "红楼梦");request.setAttribute("book", "水浒传");session.setAttribute("book", "三国演义");application.setAttribute(&quo…

在JConsole和VisualVM中查看DiagnosticCommandMBean

我已经将JConsole用作合适的通用JMX客户端已有很多年了。 该工具通常随Oracle JDK一起提供&#xff0c;并且易于使用。 在JMX交互方面&#xff0c;JConsole优于VisualVM的最大优点是JConsole带有内置的MBeans选项卡&#xff0c;而必须为VisualVM中的相同功能应用插件。 但是&am…

人人商城生成app教程_人人商城APP打包教程(APICLOUD版)

一.APP环境搭建和配置编译1.登录APICLOUD后台新建应用step1 注册账号注册apicloud 账号并登录APICLOUD控制台step2 新建应用再账户下面找到开发控制台>开发控制台>创建应用 填写应用名和说明&#xff0c;必选Native App创建Native App2 .开发工具下载安装APICLOUD开发工具…

WPF快速入门系列(2)——深入解析依赖属性

一、引言 感觉最近都颓废了&#xff0c;好久没有学习写博文了&#xff0c;出于负罪感&#xff0c;今天强烈逼迫自己开始更新WPF系列。尽管最近看到一篇WPF技术是否老矣的文章&#xff0c;但是还是不能阻止我系统学习WPF。今天继续分享WPF中一个最重要的知识点——依赖属性。 二…

圆台下料展开计算方法_怎么画 圆锥台展开图

展开全部1、 画出圆台的主视抄图(等腰梯形)袭&#xff1a;圆台的上bai下底直径为等腰梯形du的上zhi下底&#xff0c;圆台的高为等dao腰梯形的高&#xff1b;2、将等腰梯形补画成等腰三角形&#xff1b;(图中的虚线三角形即为补画部分)&#xff1b;3、以三角形的顶点为圆心&…

junit rule_Tomcat上下文JUnit @Rule

junit rule创建测试上下文的JUnit Rule的初稿。 这可以用Spring上下文规则可用于 这个帖子 创建集成测试一个完整的Spring上下文。 import org.apache.commons.dbcp.BasicDataSource; import org.apache.log4j.Logger; import org.junit.rules.TestRule; import org.junit.runn…

.31-浅析webpack源码之doResolve事件流(3)

放个流程图&#xff1a; 这里也放一下request对象内容&#xff0c;这节完事后如下(把vue-cli的package.json也复制过来了)&#xff1a; /*{ context: { issuer: , compiler: undefined },path: d:\\workspace\\doc,request: ./input.js,query: ,module: false,directory: false…

mysql数据库txt备份linux_linux备份mysql数据库

MYSQL定期备份是一项重要的工作&#xff0c;但人工操作太繁琐&#xff0c;也难避免有所疏漏&#xff0c;使用下面的方法即可让系统定期备份数据。1、创建备份文件夹#cd /www#makedir backup2、编写运行脚本#vi autobackup写入以下内容&#xff1a;filenamedate %Y%m%dmysql_bin…

python序列操作函数有哪些_Python笔记--序列操作函数

1All()&#xff1a;判断给出的可迭代参数iterable中所有元素是否均为true&#xff0c;是则返回true&#xff0c;否则返回false。注&#xff1a;除了0&#xff0c;空&#xff0c;False外都算作true。空元组&#xff0c;空列表返回true。语法&#xff1a;all(iterable)参数&#…

c++ 虚函数,纯虚函数的本质区别

转载博客&#xff1a;https://mp.weixin.qq.com/s?__bizMzAxNzYzMTU0Ng&amp;mid2651289202&amp;idx1&amp;sn431ffd1fae4823366a50b68aed2838d4&amp;chksm80114627b766cf31f72018ef5f1fe29591e9f6f4bd72018e7aea849342ca6f0a271fb38465ae#rd 学习C的多态性&…