根据值获取枚举类对象工具类EnumUtils
枚举类
public enum Sex { man("M","男"),woman("W","女");
private String myCode;
private String value; private Sex(String myCode, String value) {
this.myCode = myCode;
this.value = value;
}
public String getMyCode() {
return myCode;
}
public void setMyCode(String myCode) {
this.myCode = myCode;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
} }
公共工具类
/**
* https://blog.csdn.net/u010125873/article/details/81386320
* @author admin
*/
public class EnumUtils { private static Map<Class,Object> map = new ConcurrentHashMap<>(); /**
* 根据条件获取枚举对象
* @param className 枚举类
* @param predicate 筛选条件
* @param <T>
* @return
*/
@SuppressWarnings("unchecked")
public static <T> Optional<T> getEnumObject(Class<T> className, Predicate<T> predicate) {
if(!className.isEnum()){
// logger.info("Class 不是枚举类");
return null;
}
Object obj = map.get(className);
T[] ts = null;
if(obj == null){
ts = className.getEnumConstants();
map.put(className,ts);
}else{
ts = (T[])obj;
}
return Arrays.stream(ts).filter(predicate).findAny();
} public static void main(String[] args) { Optional<Sex> m = EnumUtils.getEnumObject(Sex.class, e -> e.getMyCode().equals("W"));
System.out.println(m.isPresent() ? m.get().getValue():null);
}
}
特点:
1)能自动获取枚举类中的方法,如e.getMyCode()和m.get().getValue()
参考:https://blog.csdn.net/u010125873/article/details/81386320
另外一种通过反射实现:
public class EnumHelperUtil{
/**
* 使用枚举类型对应的typeName获取枚举类型
* @param clazz 枚举类的class
* @param getTypeNameMethodName 传入的typeName的get方法
* @param typeName 传入的typeName值,这个方法为Object类型
*/
public static <T extends Enum<T>> T getEnumsValue(Class<T> clazz,String getTypeNameMethodName, Object typeName){
T result = null;
try{
T[] arr = clazz.getEnumConstants();
Method targetMethod = clazz.getDeclaredMethod(getTypeNameMethodName);
Object typeNameVal = null;
for(T entity:arr){
typeNameVal = targetMethod.invoke(entity);
if(typeNameVal.equals(typeName)){
result = entity;
break;
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
return result;
} public static void main(String[] args) {
Sex byStringTypeName = EnumHelperUtil.getEnumsValue(Sex.class, "getMyCode", 1);
System.out.println(byStringTypeName.getValue());
}
}
链接:https://blog.csdn.net/busbanana/article/details/72954676
注意:原文中提供了Integer和String的2种方法,而本例统一转为Object,只提供一个方法。
根据值获取枚举类对象工具类EnumUtils的更多相关文章
- 第三章 EnumUtil根据值获取枚举对象
项目中使用枚举类的好处这里不再赘述,在使用枚举值时,通常需要根据值来获取枚举对象,下面介绍两种实现方案: 1.在枚举类中定义方法实现 首先给出如下性别枚举类: public enum SexEnum ...
- 对象工具类 - ObjectUtils.java
对象工具类,提供对象克隆.获取对象属性.类型判断.Map转换对象.对象转Map.设置对象属性等. 源码如下:(点击下载 - ObjectUtils.java .JsonUtils.java .gso ...
- EncryptHelper加密对象-工具类
using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.W ...
- Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)
当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...
- Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable
Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...
- C++类对象作为类成员
//当其他类的对象作为本类的成员 构造的时候先去构造类的对象 再去构造自身 //析构函数: 先进后出 先去构造Phone 再去构造Person Person先退出 Phone后退出 //析构与构造顺序 ...
- JAVA 获取文件的MD5值大小以及常见的工具类
/** * 获取文件的MD5值大小 * * @param file * 文件对象 * @return */ public static String getMD5(File file) { FileI ...
- 获取Spring容器Bean对象工具类
在开发中,总是能碰到用注解注入不了Spring容器里面bean对象的问题.为了解决这个问题,我们需要一个工具类来直接获取Spring容器中的bean.因此就写了这个工具类,在此记录一下,方便后续查阅. ...
- 获取SpringBean对象工具类
获取SpringBean工具类 SpringBeanUtil代码如下: package com.meeno.wzq.util; import org.springframework.beans.Bea ...
随机推荐
- 爬虫中BeautifulSoup4解析器
CSS 选择器:BeautifulSoup4 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据. lxml 只会 ...
- centos6.10中部署percona-mysql双实例的方法
centos6.10中部署percona-mysql双实例的方法 数据库的同步关系:192.168.11.53(master) --> slave(192.168.10.189) --> ...
- Spring cloud微服务安全实战-7-6自定义metrics监控指标(1)
自己写代码来定义一个metrics,然后让prmetheus收走,在grafana里面定义一个panel并展示出来. prometheus的四种metrics指标.虽然所有的metrics都是数字,但 ...
- LinQ中合并、连接、相交、与非查询
LinQ中Union合并查询:连接不同的集合,自动过滤相同项:延迟.即是将两个集合进行合并操作,过滤相同的项 var cities = (from p in mylinq.System_Places ...
- [LeetCode] 295. Find Median from Data Stream 找出数据流的中位数
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
- oracle11G 命令【导库数量对比】
1.查询用户有哪些表 select * from all_tables where owner='ZJY'; 160 rows selected. 2. 查询总数 select object_type ...
- 如何用Docker部署Spring Boot项目
1.idea中安装docker插件: 2.新建DockerFile,内容如下. # 基础镜像使用java FROM java:8 # 作者 MAINTAINER vic <test@163.co ...
- 深度解析qml引擎---(2)绑定(binding)
强烈的希望是人生中比任何欢乐更大的兴奋剂.--尼采 上一篇文章讲了QML引擎加载qml文件的过程,大体过程是,解析qml文件,然后为文件中的每个元素创建对应的c++对象.例如,qml文件中如果使用了T ...
- 07 XML知识点--学习笔记
1.XML概念:Extensible Markup Language 可扩展标记语言 可扩展:标签都是自定义的. <user> <student> 功能 * 存储数据 1. 配 ...
- Fiddler抓包工具如何可以抓取HTTPS