Java中Optional含值时,orElse的参数为何仍被调用?
为什么Optional包含值时,orElse传入的方法仍会被执行?
这问题我当初刚接触Optional的时候也踩过一模一样的坑!其实这是orElse()方法的设计特性导致的——它是立即求值的,不管调用它的Optional对象是否包含非空值,传入的参数都会先被计算出来。
先看你给出的代码:
public static void main(String[] args){ String o = Optional.ofNullable("world") .map(str -> "hello" + str) .orElse(dontCallMe()); System.out.println(o); } private static String dontCallMe() { System.out.println("should Not have called"); return "why god why"; }
在执行orElse(dontCallMe())这行代码时,JVM会优先执行dontCallMe()方法拿到返回值,再把这个值传给orElse方法,哪怕此时Optional里已经有"helloworld"这个有效内容了。
如果想要实现“只有Optional为空时才执行目标方法”的需求,你应该用**orElseGet()方法。它接受一个Supplier函数式接口,是懒加载**的——只有当Optional确实为空的时候,才会调用Supplier的get()方法执行逻辑。
修改后的代码示例:
public static void main(String[] args){ String o = Optional.ofNullable("world") .map(str -> "hello" + str) .orElseGet(() -> dontCallMe()); System.out.println(o); } private static String dontCallMe() { System.out.println("should Not have called"); return "why god why"; }
这样运行后,就只会打印helloworld,不会输出那句不该出现的提示了。
最后再简单总结下两者核心区别:
orElse(T):参数是具体的对象,调用时会立即求值,无论Optional是否为空orElseGet(Supplier<T>):参数是Supplier接口实现,只有Optional为空时才会执行对应的逻辑
内容的提问来源于stack exchange,提问作者Bharat Bhagat
相关产品推荐
相关产品推荐

