You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:25:24