我在 Java 中使用可选 API 时遇到了意外行为。
Session session = sessionService
.getSessionById(id)
.orElse(
sessionService.createSession(
new Session(...)
)
);
上面的代码执行 getSessionById() 方法返回找到的对象,但随后它还执行 orElse() 方法内部的内容,因为该对象存在,所以这是不可能的。
当我使用 orElseGet() 或 orElseThrow() 时,它们不会被执行并且代码运行正确。
您认为为什么会发生这种情况?
因为您在调用 orElse 之前执行 sessionService.createSession 。
您的代码与编写的代码完全相同:
Session defaultSession = sessionService.createSession(new Session(...));
Session session = sessionService.getSessionById(id).orElse(defaultSession);
如您所见,第一行每次都会被调用。
A
Supplier<Session>
则不同:创建Supplier 并不执行Supplier 的get
方法。供应商只是一个轻量级对象,如果其他代码选择这样做,其get
方法可能会稍后执行。