com.dahuatech.hutool.core.util.EnumUtil Maven / Gradle / Ivy
package com.dahuatech.hutool.core.util;
import com.dahuatech.hutool.core.lang.Assert;
import com.dahuatech.hutool.core.map.MapUtil;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 枚举工具类
*
* @author looly
* @since 3.3.0
*/
public class EnumUtil {
/**
* 指定类是否为Enum类
*
* @param clazz 类
* @return 是否为Enum类
*/
public static boolean isEnum(Class> clazz) {
Assert.notNull(clazz);
return clazz.isEnum();
}
/**
* 指定类是否为Enum类
*
* @param obj 类
* @return 是否为Enum类
*/
public static boolean isEnum(Object obj) {
Assert.notNull(obj);
return obj.getClass().isEnum();
}
/**
* Enum对象转String,调用{@link Enum#name()} 方法
*
* @param e Enum
* @return name值
* @since 4.1.13
*/
public static String toString(Enum> e) {
return null != e ? e.name() : null;
}
/**
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)}
*
* @param 枚举类型泛型
* @param enumClass 枚举类
* @param value 值
* @return 枚举值
* @since 4.1.13
*/
public static > E fromString(Class enumClass, String value) {
return Enum.valueOf(enumClass, value);
}
/**
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)}
* 如果无枚举值,返回默认值
*
* @param 枚举类型泛型
* @param enumClass 枚举类
* @param value 值
* @param defaultValue 无对应枚举值返回的默认值
* @return 枚举值
* @since 4.5.18
*/
public static > E fromString(Class enumClass, String value, E defaultValue) {
return ObjectUtil.defaultIfNull(fromStringQuietly(enumClass, value), defaultValue);
}
/**
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)},转换失败返回{@code null} 而非报错
*
* @param 枚举类型泛型
* @param enumClass 枚举类
* @param value 值
* @return 枚举值
* @since 4.5.18
*/
public static > E fromStringQuietly(Class enumClass, String value) {
if (null == enumClass || StrUtil.isBlank(value)) {
return null;
}
try {
return fromString(enumClass, value);
} catch (IllegalArgumentException e) {
return null;
}
}
/**
* 模糊匹配转换为枚举,给定一个值,匹配枚举中定义的所有字段名(包括name属性),一旦匹配到返回这个枚举对象,否则返回null
*
* @param 枚举类型
* @param enumClass 枚举类
* @param value 值
* @return 匹配到的枚举对象,未匹配到返回null
*/
@SuppressWarnings("unchecked")
public static > E likeValueOf(Class enumClass, Object value) {
if (value instanceof CharSequence) {
value = value.toString().trim();
}
final Field[] fields = ReflectUtil.getFields(enumClass);
final Enum>[] enums = enumClass.getEnumConstants();
String fieldName;
for (Field field : fields) {
fieldName = field.getName();
if (field.getType().isEnum()
|| "ENUM$VALUES".equals(fieldName)
|| "ordinal".equals(fieldName)) {
// 跳过一些特殊字段
continue;
}
for (Enum> enumObj : enums) {
if (ObjectUtil.equal(value, ReflectUtil.getFieldValue(enumObj, field))) {
return (E) enumObj;
}
}
}
return null;
}
/**
* 枚举类中所有枚举对象的name列表
*
* @param clazz 枚举类
* @return name列表
*/
public static List getNames(Class extends Enum>> clazz) {
final Enum>[] enums = clazz.getEnumConstants();
if (null == enums) {
return null;
}
final List list = new ArrayList<>(enums.length);
for (Enum> e : enums) {
list.add(e.name());
}
return list;
}
/**
* 获得枚举类中各枚举对象下指定字段的值
*
* @param clazz 枚举类
* @param fieldName 字段名,最终调用getXXX方法
* @return 字段值列表
*/
public static List