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枚举的实用方法相关推荐

  1. 如何给html文件夹密码,怎样给文件夹加上密码_分享两种给文件夹设密码的方法...

    现在大家习惯把重要的文件或比较隐私的文件存放在电脑上,出于安全考虑,大家会选择给文件夹设密码.但是问题来了,怎样给文件夹加密码呢?估计大多数的人都还不太清楚该怎么设置吧,别着急,这里小编分享两种给文件 ...

  2. layui生产管理系统_分享两款Java Spring框架的开源MES制造执行系统

    随着工业互联网.智能制造的快速发展,MES制造执行系统的需求量也渐渐变大,有不少软件企业或者互联网企业都在做一块,现在可谓是百家争鸣.在国内影响力比较大的MES企业有SAP(思爱普).Siemens( ...

  3. java反射获取方法内部_公共技术点之 Java 反射 Reflection

    本文为 Android 开源项目源码解析 公共技术点中的 Java 反射 部分 分析者:Mr.Simple,校对者:Trinea,校对状态:未完成 1. 了解 Java 中的反射 1.1 什么是 Ja ...

  4. command对象提供的3个execute方法是_并发面试题:java中有几种方法可以实现一个线程?...

    创建并启动线程的6种方式 继承Thread类创建线程 实现Runnable接口创建线程 使用Callable和FutureTask创建线程 使用线程池,例如用Executor框架 Spring实现多线 ...

  5. java8 两个list合并_深入介绍和使用 Java 8 的 Collector 接口和 Collectors 工具类

    1 概述 java.util.stream.Collector: Collector 接口用于将 Stream 流中的数据加工,转换,处理,最后返回结果. java.util.stream.Colle ...

  6. mysql 查看等待事件_分享两个实用SQL--查看故障时间等待事件、问题sql及会话访问次数...

    分享两个SQL,这两个SQL只是基础原型,大家自己自定义条件去做一些调整.主要是在前面讲过的dba_hist_active_sess_history相关sql上总结出来的比较实用的sql. DBA_H ...

  7. java显示一张图片不显示_微信图片不可显示java解决方法

    场景: 微信上传了图片素材,返回了图片url,然后不能在img标签中正常显示. 原因是微信做了图片防盗连接. 解决方法: 原理:使用你的服务端脚本,远程抓取图片,然后输出image/* 格式,就可以了 ...

  8. java多线程写在哪一层_面试知识点三:Java多线程

    35.并行和并发有什么区别? 36.线程和进程的区别? 37.守护线程是什么? 38.创建线程有哪几种方式? 39.说一下 runnable 和 callable 有什么区别? 40.线程有哪些状态? ...

  9. java将dxf展示在网页_七天串起java技术栈-第四天

    上期回顾与本期预告: 昨天,我们从一个页面出发,搞清楚了前端,后端,接口的概念.并且还引出了servlet与tomcat. 今天,继续我们的探索之旅,看看又会接触到什么新玩意. step15:使用se ...

最新文章

  1. 上手!深度学习最常见的26个模型练习项目汇总
  2. 3d slicer调整窗宽窗位_3D人脸模型月销量上千单,谁在打印,谁在帮打?
  3. word2vec的数据结构
  4. sqlnet.ora限制导致双机应用资源启动失败
  5. matlab m n size a,matlab—size用法总结
  6. PHPCMS 模板的设置
  7. SpringBoot三招组合拳,手把手教你打出优雅的后端接口
  8. group() 数组java_java 根据每个分组个数,分解数组. | 学步园
  9. mysql 2003 10038_关于MySql10038错误的完美解决方法(三种)
  10. 世界最前沿黑科技实验室 MIT Media Lab 教授 Cynthia: 让社交机器人陪伴千万家庭成为现实...
  11. python实现app自动签到器_Python实现自动签到脚本代码示例
  12. POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)
  13. python查找手册
  14. STC12参考例程(附模块资料代码注释、学习经验总结)
  15. 基于R语言做层次聚类分析
  16. 基于android的希腊字母读音手机软件,希腊字母表app下载
  17. Verilog学习日志(2021.7.31)
  18. 我国国防是全军的国防_国防部长
  19. TFT屏幕的显示阴影问题
  20. about 松峰山:

热门文章

  1. 工业级以太网交换机的应用领域有哪些?
  2. 【渝粤教育】国家开放大学2018年春季 0689-22T老年心理健康 参考试题
  3. 【渝粤题库】广东开放大学 社会保障法 形成性考核
  4. 【渝粤题库】国家开放大学2021春1359高级英语写作题目
  5. 1835财务报表分析
  6. linux操作系统学什么,Linux学习-第一天-什么是操作系统
  7. tx2无法识别网络_织点智能算法大牛刘思伟:商品识别在收银结算场景的应用与落地...
  8. Java集合(2)--Collection接口方法
  9. php baocuo error,PHP编译报错configure: error: Cannot find libmysqlclient under /usr.
  10. java json 解析null_解析包含null的原始json数组