java读取枚举类的值转成list和map方式
作者:不写bug的程序媛
这篇文章主要介绍了java读取枚举类的值转成list和map方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
java读取枚举类的值转成list和map
首先Enum类
public enum RuleTypeEnum {
//officeClerk,estimator,administrator,personnel都是国际化的key值
officeClerk("officeClerk",99),
estimator("estimator",1),
administrator("administrator",2),
personnel("personnel",3);
private String reason;
private int index;
RuleTypeEnum(String reason, int index) {
this.reason = reason;
this.index = index;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}下面为Enum工具类
public class EnumUtils {
private static Logger log= LoggerFactory.getLogger(EnumUtils.class);
/**
* 把枚举类的值都转成Map
* @param enumT 枚举类
* @param methodNames 读取的方法
* @param <T>
* @return
*/
public static <T> Map<String, String> EnumToMap(Class<T> enumT,String... methodNames) {
Map<String, String> enummap = new HashMap<String, String>();
if (!enumT.isEnum()) { //如果不是enum
return enummap;
}
T enums []= enumT.getEnumConstants(); //得到枚举类里的实例
if (enums == null || enums.length <= 0) {
return enummap;
}
int count = methodNames.length;
/**默认接口key方法*/
String keyMathod = "getReason";
/**默认接口value方法*/
String valueMathod = "getIndex";
if (count >= 1 && !"".equals(methodNames[0])) {
keyMathod = methodNames[0];
}
if (count == 2 && !"".equals(methodNames[1])) {
valueMathod = methodNames[1];
}
for (int i = 0;i < enums.length; i++) {
T tobj = enums[i];
try {
/**获取key值*/
Object resultkey = getMethodValue(keyMathod, tobj);
if ("".equals(resultkey)) {
continue;
}
/**获取value值*/
Object resultValue = getMethodValue(valueMathod, tobj);
/**如果描述不存在获取整条enum*/
if ("".equals(resultValue)) {
resultValue = tobj;
}
enummap.put(resultkey+"", resultValue+"");
} catch (Exception e) {
e.printStackTrace();
log.error("枚举类转成Map异常",e);
}
}
return enummap;
}
private static <T> Object getMethodValue(String methodName, T obj, Object... args) {
Object resut = "";
try {
/********************************* start *****************************************/
/**获取方法数组,这里只要公有的方法*/
Method[] methods = obj.getClass().getMethods();
if (methods.length <= 0) {
return resut;
}
Method method = null;
for (int i = 0, len = methods.length; i < len; i++) {
/**忽略大小写取方法*/
if (methods[i].getName().equalsIgnoreCase(methodName)) {
/**如果存在,则取出正确的方法名称*/
methodName = methods[i].getName();
method = methods[i];
break;
}
}
/*************************** end ***********************************************/
if (method == null) {
return resut;
}
/**方法执行*/
resut = method.invoke(obj, args);
if (resut == null) {
resut = "";
}
/**返回结果*/
return resut;
} catch (Exception e) {
e.printStackTrace();
}
return resut;
}
/***
* 取枚举的key 和 value 返回list
* @param enumT 枚举类
* @param methodNames 取枚举类的方法
* @param <T>
* @return
*/
public static <T> List<EnumEntity> getEnumToList(Class<T> enumT, String... methodNames) {
List<EnumEntity> enumList = new ArrayList<>(); //最终返回的list enumEntity是对枚举类的封装实体
if (!enumT.isEnum()) {
return enumList;
}
T enums[] = enumT.getEnumConstants(); //得么枚举类里所有的枚举类
if (enums.length == 0) { //如果没有枚举键和值 结束
return enumList;
}
int count = methodNames.length;
String keyMethod = "getReason"; //默认的取 key的方法
String valueMethod = "getIndex"; //默认的取 value 的方法
if (count >= 1 && !methodNames[0].equals("")) { //如果方法的长度是大于等于1的,并且不为空
keyMethod = methodNames[0];
}
if (count == 2 && !methodNames[1].equals("")) { //如果方法的长度是等于2的,并且不为空
valueMethod = methodNames[1];
}
try {
for (int i = 0; i < enums.length; i++) {
EnumEntity enumEntity = new EnumEntity();
T object = enums[i]; //得到枚举类里每条值
Object resultKey = getMethodValue(keyMethod, object); //获取key值
if (resultKey.equals("")) {
continue;
}
Object resultValue = getMethodValue(valueMethod, object); //获取value值
if (resultValue.equals("")) {
resultValue = object;
}
//MessageUtils.getMessage为读取国际化的.
enumEntity.setKey(MessageUtils.getMessage(resultKey.toString())); //把key存到实体类
enumEntity.setValue(resultValue.toString()); //把value存到实体类
enumList.add(enumEntity); //存到list
}
} catch (Exception e) {
e.getStackTrace();
log.error("枚举类转成List异常", e);
}
return enumList;
}
}下面是调用的方法
public List<EnumEntity> getRuleType() { Class<RuleTypeEnum> clasz= RuleTypeEnum.class; List<EnumEntity> list= EnumUtils.getEnumToList(clasz);
//用默认的方法名 getReason和getIndex return list; }完美~
通用java枚举类转List-Map集合
java的枚举类功能是很强大的,在平时开发中也用的比较多,有时候可能会有将枚举类转成List集合这种需求,如果能确定枚举类中的字段固定可以使用实体类接收,如果不固定的话,很多时候只能用Map来接收了。
这里实现一下java枚举类转List-Map集合
/**
* java枚举类转List<Map>集合
*
* @param clazz
* @return null-该class不是枚举类型 []-该枚举类型没有自定义字段 list-获取该枚举类型的List<Map>返回结果
*/
public static List<Map<String, Object>> enumToListMap(Class<?> clazz) {
List<Map<String, Object>> resultList = null;
// 判断是否是枚举类型
if ("java.lang.Enum".equals(clazz.getSuperclass().getCanonicalName())) {
resultList = new ArrayList<>();
// 获取所有public方法
Method[] methods = clazz.getMethods();
List<Field> fieldList = new ArrayList<>();
for (int i = 0; i < methods.length; i++) {
String methodName = methods[i].getName();
if (methodName.startsWith("get") && !"getDeclaringClass".equals(methodName)
&& !"getClass".equals(methodName)) { // 找到枚举类中的以get开头的(并且不是父类已定义的方法)所有方法
Field field = null;
try {
field = clazz.getDeclaredField(StringUtils.uncapitalize(methodName.substring(3))); // 通过方法名获取自定义字段
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
if (field != null) { // 如果不为空则添加到fieldList集合中
fieldList.add(field);
}
}
}
if (!fieldList.isEmpty()) { // 判断fieldList集合是否为空
Map<String, Object> map = null;
Enum<?>[] enums = (Enum[])clazz.getEnumConstants(); // 获取所有枚举
for (int i = 0; i < enums.length; i++) {
map = new HashMap<>();
for (int l = 0, len = fieldList.size(); l < len; l++) {
Field field = fieldList.get(l);
field.setAccessible(true);
try {
map.put(field.getName(), field.get(enums[i])); // 向map集合添加字段名称 和 字段值
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
resultList.add(map);// 将Map添加到集合中
}
}
}
return resultList;
}新建几个枚举类和普通类测试一下
public class TestEnum0 {
}public enum TestEnum1 {
TestEnum1;
}public enum TestEnum2 {
TestEnum2("TestEnum2");
private String name;
TestEnum2(String name) {
this.name = name;
}
public String getName() {
return name;
}
}public enum TestEnum3 {
TestEnum3(1, "TestEnum3", "测试枚举类");
private int id;
private String message;
private String desc;
TestEnum3(int id, String message, String desc) {
this.id = id;
this.message = message;
this.desc = desc;
}
public int getId() {
return id;
}
public String getMessage() {
return message;
}
public String getDesc() {
return desc;
}
}编写测试方法
@Test
public void enumToListMapTest() {
// 普通类
System.out.println(enumToListMap(TestEnum0.class));
// 枚举类
System.out.println(enumToListMap(TestEnum1.class));
System.out.println(enumToListMap(TestEnum2.class));
System.out.println(enumToListMap(TestEnum3.class));
}运行结果:
null
[]
[{name=TestEnum2}]
[{id=1, message=TestEnum3, desc=测试枚举类}]
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
