【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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南