发现好多枚举里面都写了一个匹配的方法,于是想着写一个公共方法:
1,通过枚举的某个属性的值获取枚举
@UtilityClass
public class EnumUtil {
/**
* K 枚举类型, V 当前类型的枚举数组
*/
private Map<String,Enum []> enumMapBySimpleName = new ConcurrentHashMap<>();
/**
* 枚举包名
*/
private final String ENUM_PACKAGE = "net.xx.xx.xx.enums";
static {
// 缓存所有枚举
Set<Class<?>> enums = ClassUtil.scanPackageBySuper(ENUM_PACKAGE, Enum.class);
enums.forEach(e->{
enumMapBySimpleName.put(e.getSimpleName(), (Enum[]) e.getEnumConstants());
});
}
/**
* 已知枚举类型和枚举某个属性值匹配枚举
* @param enumClass 枚举类型
* @param function 枚举属性get方法
* @param paramValue 属性匹配值
* @param <T> 枚举
* @param <R> 属性类型
* @return 枚举数组
*/
public <T extends Enum<T>,R extends Object> T match(Class<T> enumClass, Function<T,R> function, R paramValue){
Enum[] enums = enumMapBySimpleName.get(enumClass.getSimpleName());
return Arrays.stream(enums).map(e->(T)e).filter(e->function.apply(e).equals(paramValue)).findFirst().orElse(null);
}
}
EnumUtil.match(ConfigTypeEnum.class, ConfigTypeEnum::getCode,1)
2,返回所有枚举数据给前端下拉列表使用
@UtilityClass
public class EnumUtil {
/**
* K 枚举类型, V 当前类型的枚举数组
*/
private Map<String,Enum []> enumMapBySimpleName = new ConcurrentHashMap<>();
/**
* 前端获取枚举数据列表传的属性名称拼接后缀
*/
private final String SUFFIX = "Enum";
/**
* 枚举包名
*/
private final String ENUM_PACKAGE = "net.xx.xx.xx.enums";
static {
// 缓存所有枚举
Set<Class<?>> enums = ClassUtil.scanPackageBySuper(ENUM_PACKAGE, Enum.class);
enums.forEach(e->{
enumMapBySimpleName.put(e.getSimpleName(), (Enum[]) e.getEnumConstants());
});
}
/**
* 已知枚举类型和枚举某个属性值匹配枚举
* @param enumClass 枚举类型
* @param function 枚举属性get方法
* @param paramValue 属性匹配值
* @param <T> 枚举
* @param <R> 属性类型
* @return 枚举数组
*/
public <T extends Enum<T>,R extends Object> T match(Class<T> enumClass, Function<T,R> function, R paramValue){
Enum[] enums = enumMapBySimpleName.get(enumClass.getSimpleName());
return Arrays.stream(enums).map(e->(T)e).filter(e->function.apply(e).equals(paramValue)).findFirst().orElse(null);
}
/**
* 根据枚举名称获取枚举数组
*
* @param enumName 枚举名称 支持首字母小写、无'Enum'后缀
* @return 枚举数组
*/
public Enum [] findEnumsByName(String enumName){
String enumSimpleName = enumNameConvert(enumName);
return enumMapBySimpleName.get(enumSimpleName);
}
/**
* 根据多个枚举名称获取枚举值
* @param enumNames 枚举名称
* @return 枚举数组Map
*/
public Map<String, Enum[]> findEnumsByNames(List<String> enumNames){
Map<String, Enum[]> result = new HashMap<>(8);
enumNames.forEach(enumName->{
result.put(enumName,findEnumsByName(enumName));
});
return result;
}
/**
* 补全名称 首字母转大写,无'Enum'后缀时添加'Enum'后缀
* enable ==> EnableEnum
* Enable ==> EnableEnum
* enableEnum ==> EnableEnum
* @param enumName 枚举名称 支持首字母小写,无'Enum'后缀
* @return 枚举全名
*/
private String enumNameConvert(String enumName){
if(!enumName.endsWith(SUFFIX)){
enumName = enumName+SUFFIX;
}
return StringUtils.capitalize(enumName);
}
}
注意枚举类加上注解
@JsonFormat(shape = JsonFormat.Shape.OBJECT)