com.mogudiandian.util.lang.LooseEnumGetter Maven / Gradle / Ivy
Show all versions of joshua-util Show documentation
package com.mogudiandian.util.lang;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
/**
* 宽松的枚举工具类
* 查找key基于toString,解决了某些enum的属性是Integer,用Long查询不到的情况
* @author Joshua Sun
* @since 1.0.3
*/
public final class LooseEnumGetter {
private static Table, Function, ?>, Map>> cache;
static {
cache = HashBasedTable.create();
}
private LooseEnumGetter() {
super();
}
/**
* 根据枚举类和属性获取枚举
* @param enumClass 枚举类
* @param getterMethodReference 属性Getter的Method-Reference
* @param value 属性值
* @param 枚举类型
* @param 属性类型
* @param 属性值
* @return 枚举
*/
@SuppressWarnings("unchecked")
public static , P, V> E get(Class enumClass, Function getterMethodReference, V value) {
Map enumMap = (Map) cache.get(enumClass, getterMethodReference);
if (enumMap == null) {
enumMap = EnumSet.allOf(enumClass).stream().collect(HashMap::new, (m, e) -> m.put(String.valueOf(getterMethodReference.apply(e)), e), Map::putAll);
cache.put(enumClass, getterMethodReference, (Map>) enumMap);
}
return enumMap.get(String.valueOf(value));
}
/**
* 根据枚举类和属性获取枚举
* @param enumClass 枚举类
* @param getterMethodReference 属性Getter的Method-Reference
* @param value 属性值
* @param defaultValue 默认值
* @param 枚举类型
* @param 属性类型
* @param 属性值
* @return 枚举
*/
public static , P, V> E getOrDefault(Class enumClass, Function getterMethodReference, V value, E defaultValue) {
return Optional.ofNullable(get(enumClass, getterMethodReference, value)).orElse(defaultValue);
}
/**
* 根据枚举的某一个属性(输入属性)和值,获取另一个属性(输出属性)的值
* @param enumClass 枚举类
* @param keyMethodReference 输入属性的Method-Reference
* @param key 输入属性值
* @param valueMethodReference 输出属性的Method-Reference
* @return 输出属性的值 默认为空
* @param 枚举类型
* @param 输入属性类型
* @param 输入属性值
* @param 输出属性类型
*/
public static , P, K, R> R getEnumPropertyValue(Class enumClass, Function keyMethodReference, K key, Function valueMethodReference) {
return getEnumPropertyValue(enumClass, keyMethodReference, key, valueMethodReference, null);
}
/**
* 根据枚举的某一个属性(输入属性)和值,获取另一个属性(输出属性)的值
* @param enumClass 枚举类
* @param keyMethodReference 输入属性的Method-Reference
* @param key 输入属性值
* @param valueMethodReference 输出属性的Method-Reference
* @param defaultValue 默认输出属性值
* @return 输出属性的值
* @param 枚举类型
* @param 输入属性类型
* @param 输入属性值
* @param 输出属性类型
*/
public static , P, K, R> R getEnumPropertyValue(Class enumClass, Function keyMethodReference, K key, Function valueMethodReference, R defaultValue) {
return Optional.ofNullable(key)
.map(x -> LooseEnumGetter.get(enumClass, keyMethodReference, x))
.map(valueMethodReference)
.orElse(defaultValue);
}
}