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

Java中Optional的orElse()在对象存在时仍执行的原因

问题原因及解决方案

为什么orElse()里的代码会提前执行?

Java的方法调用规则是:在调用任何方法前,必须先计算并传入所有参数的值。orElse(T other)方法的参数是一个具体对象,所以不管Optional是否包含非空值,sessionService.createSession(new Session(...))这段代码都会在调用orElse前被执行,用来生成传入的参数值。这就是即使getSessionById(id)返回了有效对象,创建Session的逻辑仍然会跑一遍的原因。

正确写法:用orElseGet()替代orElse()

要实现“只有当Optional为空时才执行创建逻辑”,应该使用orElseGet(Supplier<? extends T> supplier)方法。它接受一个Supplier函数式接口,只有当Optional为空时,才会调用Supplier.get()生成替代值。

修改后的代码如下:

Session session = sessionService
                        .getSessionById(id)
                        .orElseGet(() -> 
                                sessionService.createSession(
                                        new Session(...)
                                )
                        );

这样一来,只有当getSessionById(id)返回的Optional为空时,createSession的逻辑才会被执行,符合预期。

内容的提问来源于stack exchange,提问作者Souhaib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:25:54