java 设置两个方法互斥_分享两个操作Java枚举的实用方法
1. 前言
Java枚举在开发中是非常实用的。今天再来分析几个小技巧并且回答一些同学的的疑问。首先要说明的是我的枚举建立在以下的范式之中:
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的三个新特性:泛型附加约束、Optional和Stream API。这些知识点以往我都分享过,有兴趣的可以到 felord.cn 搜索一下。如果你有更好的办法可以留言讨论。多多关注:码农小胖哥,更多原创干货分享。
java 设置两个方法互斥_分享两个操作Java枚举的实用方法相关推荐
- 如何给html文件夹密码,怎样给文件夹加上密码_分享两种给文件夹设密码的方法...
现在大家习惯把重要的文件或比较隐私的文件存放在电脑上,出于安全考虑,大家会选择给文件夹设密码.但是问题来了,怎样给文件夹加密码呢?估计大多数的人都还不太清楚该怎么设置吧,别着急,这里小编分享两种给文件 ...
- layui生产管理系统_分享两款Java Spring框架的开源MES制造执行系统
随着工业互联网.智能制造的快速发展,MES制造执行系统的需求量也渐渐变大,有不少软件企业或者互联网企业都在做一块,现在可谓是百家争鸣.在国内影响力比较大的MES企业有SAP(思爱普).Siemens( ...
- java反射获取方法内部_公共技术点之 Java 反射 Reflection
本文为 Android 开源项目源码解析 公共技术点中的 Java 反射 部分 分析者:Mr.Simple,校对者:Trinea,校对状态:未完成 1. 了解 Java 中的反射 1.1 什么是 Ja ...
- command对象提供的3个execute方法是_并发面试题:java中有几种方法可以实现一个线程?...
创建并启动线程的6种方式 继承Thread类创建线程 实现Runnable接口创建线程 使用Callable和FutureTask创建线程 使用线程池,例如用Executor框架 Spring实现多线 ...
- java8 两个list合并_深入介绍和使用 Java 8 的 Collector 接口和 Collectors 工具类
1 概述 java.util.stream.Collector: Collector 接口用于将 Stream 流中的数据加工,转换,处理,最后返回结果. java.util.stream.Colle ...
- mysql 查看等待事件_分享两个实用SQL--查看故障时间等待事件、问题sql及会话访问次数...
分享两个SQL,这两个SQL只是基础原型,大家自己自定义条件去做一些调整.主要是在前面讲过的dba_hist_active_sess_history相关sql上总结出来的比较实用的sql. DBA_H ...
- java显示一张图片不显示_微信图片不可显示java解决方法
场景: 微信上传了图片素材,返回了图片url,然后不能在img标签中正常显示. 原因是微信做了图片防盗连接. 解决方法: 原理:使用你的服务端脚本,远程抓取图片,然后输出image/* 格式,就可以了 ...
- java多线程写在哪一层_面试知识点三:Java多线程
35.并行和并发有什么区别? 36.线程和进程的区别? 37.守护线程是什么? 38.创建线程有哪几种方式? 39.说一下 runnable 和 callable 有什么区别? 40.线程有哪些状态? ...
- java将dxf展示在网页_七天串起java技术栈-第四天
上期回顾与本期预告: 昨天,我们从一个页面出发,搞清楚了前端,后端,接口的概念.并且还引出了servlet与tomcat. 今天,继续我们的探索之旅,看看又会接触到什么新玩意. step15:使用se ...
最新文章
- 上手!深度学习最常见的26个模型练习项目汇总
- 3d slicer调整窗宽窗位_3D人脸模型月销量上千单,谁在打印,谁在帮打?
- word2vec的数据结构
- sqlnet.ora限制导致双机应用资源启动失败
- matlab m n size a,matlab—size用法总结
- PHPCMS 模板的设置
- SpringBoot三招组合拳,手把手教你打出优雅的后端接口
- group() 数组java_java 根据每个分组个数,分解数组. | 学步园
- mysql 2003 10038_关于MySql10038错误的完美解决方法(三种)
- 世界最前沿黑科技实验室 MIT Media Lab 教授 Cynthia: 让社交机器人陪伴千万家庭成为现实...
- python实现app自动签到器_Python实现自动签到脚本代码示例
- POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)
- python查找手册
- STC12参考例程(附模块资料代码注释、学习经验总结)
- 基于R语言做层次聚类分析
- 基于android的希腊字母读音手机软件,希腊字母表app下载
- Verilog学习日志(2021.7.31)
- 我国国防是全军的国防_国防部长
- TFT屏幕的显示阴影问题
- about 松峰山:
热门文章
- 工业级以太网交换机的应用领域有哪些?
- 【渝粤教育】国家开放大学2018年春季 0689-22T老年心理健康 参考试题
- 【渝粤题库】广东开放大学 社会保障法 形成性考核
- 【渝粤题库】国家开放大学2021春1359高级英语写作题目
- 1835财务报表分析
- linux操作系统学什么,Linux学习-第一天-什么是操作系统
- tx2无法识别网络_织点智能算法大牛刘思伟:商品识别在收银结算场景的应用与落地...
- Java集合(2)--Collection接口方法
- php baocuo error,PHP编译报错configure: error: Cannot find libmysqlclient under /usr.
- java json 解析null_解析包含null的原始json数组