【Optional】Java8之Optional中orElse和orElseGet的区别

背景

JAVA8之后引入了 optional
关于optional的使用也比较多了,此处暂时不表

这儿暂且只说一下 orElse和orElseGet的区别

写了一个获取枚举类型的工具类,来做个例子

嗯,怎么说呢,看代码吧,如果没有表达清楚,也没办法了。

如果orElseGet 和 orElse 里面都有方法要执行的话,他们的区别是:
orElseGet:不一定执行
orElse 一定执行


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

posted @ 2023-01-01 10:53  aaacarrot  阅读(503)  评论(0编辑  收藏  举报