背景
JAVA8之后引入了 optional
关于optional的使用也比较多了,此处暂时不表
这儿暂且只说一下 orElse和orElseGet的区别
写了一个获取枚举类型的工具类,来做个例子
嗯,怎么说呢,看代码吧,如果没有表达清楚,也没办法了。
private static Map<String, Map<Object, Object>> enumMap = new HashMap();
// 看这个方法就行
public static Object enumConvert(String enumClazz, Object code) {
Object value = Optional.ofNullable(enumMap.get(enumClazz))
.map(m -> m.get(code))
// 如果 map 里面拿得到 code对应的值的话,就不会执行 initEnumAndReturn 方法的, 注意这里用的是 lamda表达式的
//.orElseGet(() -> initEnumAndReturn(enumClazz, code));
// 无论 map 里面有没有 code 值,都会执行 initEnumAndReturn() 方法,因为这里其实是返回一个“值”的,所以这个方法必须先执行,才能拿得到 “值”。这是 orElseGet 与 orElse 的区别。
.orElse(initEnumAndReturn(enumClazz, enumClazz));
return value;
}
// 这个方法可以忽略
private static Object initEnumAndReturn(String enumClazz, Object code) {
if(null == code || StringUtils.EMPTY.equals(code)){
return code;
}
Object newValue = null;
try {
Class<?> clz = Class.forName(enumClazz);
enumMap.putIfAbsent(enumClazz, new HashMap<>());
Object[] objects = clz.getEnumConstants();
Method codeMethod = clz.getMethod("getCode");
Method valueMethod = clz.getMethod("getValue");
for (Object obj : objects) {
// 3.调用对应方法,得到枚举常量中字段的值
Object eCode = codeMethod.invoke(obj);
Object eValue = valueMethod.invoke(obj);
if (null != eCode && null != eValue) {
enumMap.get(enumClazz).put(eCode, eValue);
}
if (String.valueOf(code).equals(String.valueOf(eCode))){
newValue = eValue;
}
}
} catch (ClassNotFoundException | NoSuchMethodException e) {
log.error("", e);
} catch (InvocationTargetException e) {
log.error("", e);
} catch (IllegalAccessException e) {
log.error("", e);
}
return newValue;
}
参考资料
参考之一:https://zhuanlan.zhihu.com/p/160997807
标签:code,orElseGet,Object,enumClazz,Optional,Java8,orElse,initEnumAndReturn From: https://www.cnblogs.com/aaacarrot/p/17017849.html