即使对象存在,Optional 的 oElse() 也会执行

问题描述 投票:0回答:1

我在 Java 中使用可选 API 时遇到了意外行为。

Session session = sessionService
                            .getSessionById(id)
                            .orElse(
                                    sessionService.createSession(
                                            new Session(...)
                                    )
                            );

上面的代码执行 getSessionById() 方法返回找到的对象,但随后它还执行 orElse() 方法内部的内容,因为该对象存在,所以这是不可能的。

当我使用 orElseGet() 或 orElseThrow() 时,它们不会被执行并且代码运行正确。

您认为为什么会发生这种情况?

java option-type optional-chaining
1个回答
1
投票

因为您在调用 orElse 之前执行 sessionService.createSession 。

您的代码与编写的代码完全相同:

Session defaultSession = sessionService.createSession(new Session(...));
Session session = sessionService.getSessionById(id).orElse(defaultSession);

如您所见,第一行每次都会被调用。

A

Supplier<Session>
则不同:创建Supplier 并不执行Supplier 的
get
方法。供应商只是一个轻量级对象,如果其他代码选择这样做,其
get
方法可能会稍后执行。

© www.soinside.com 2019 - 2024. All rights reserved.