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
相关产品推荐
相关产品推荐

