根据值获取枚举类对象工具类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 ...
随机推荐
- linux学习(3):linux常用命令大全
Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短 ...
- 并发下sftp连接报错——com.jcraft.jsch.JSchException: connection is closed by foreign host
当对单接口极限测试时,随着并发量上升,接口稳定性出现不稳定的情况,排查后台日志,发现报错在该接口调用sftp上传时出现问题(确切的是在初始化连接时失败) 原因:系统SSH终端连接数配置过小,查看虚拟机 ...
- python去除BOM头\ufeff等特殊字符
1.\ufeff 字节顺序标记 去掉\ufeff,只需改一下编码就行,把UTF-8编码改成UTF-8-sigwith open(file_path, mode='r', encoding='UTF-8 ...
- java查看线程的堆栈信息
通过使用jps 命令获取需要监控的进程的pid,然后使用jstack pid 命令查看线程的堆栈信息. 通过jstack 命令可以获取当前进程的所有线程信息. 每个线程堆中信息中,都可以查看到线程ID ...
- Arcgis案例操作教程——去掉Z值和M值
Arcgis案例操作教程--去掉Z值和M值 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 处理前 处理后: 处理方法 商务合作,科技咨 ...
- ISO/IEC 9899:2011 条款6.10.2——源文件包含
6.10.2 源文件包含 约束 1.一个#include指示符应该指定一个能被实现处理的头文件或源文件. 语义 2.一个预处理指示符如下形式 # include <h-char-se ...
- matlab学习笔记8 基本绘图命令-三维绘图
一起来学matlab-matlab学习笔记8 基本绘图命令_6 三维绘图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...
- Shell流程控制语句if
(1).if语句 语法格式: if 判断条件 ; then 命令 fi 或 if 判断条件 then 命令 fi if语句流程图: 实例:判断命令是否执行成功,成功则输出语句This is ok. [ ...
- net::ERR_ABORTED 404 (Not Found)
对于按需加载(on-demand-load)或加载外部资源(external resources)(如图片.文件等)来说,webpack的配置,output.publicPath是很重要的选项.如果指 ...
- [LeetCode] 556. Next Greater Element III 下一个较大的元素 III
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...