我想知道 Optional orElseGet 的有意义的用法

I would like to know about the meaningful usage of Optional orElseGet

首先,让我澄清一下,这不是问这种方法“如何使用”或“差异”的问题。

我有一个查询要在数据库中按 ID 查找一个对象。

如果此 ID 无效,则不会 return 编辑任何对象,这将导致错误。

为防止这种情况发生,我将return对象包裹在Optional中,问题就解决了。

这时候,新的问题出现了。

在检索这个对象的上下文中,我发现我只有两个选择。

  1. 既然有一个对象returned,这个对象就正常使用了。

  2. 没有对象 returned,所以除了 null 或 Throw,我们别无他法。

我的 return 对象是 UserEntity。

即当我使用值

UserEntity user = getUser().orElstGet(null);

UserEntity user = getUser().orElstThrow(...);

我不认为还有什么可以做的。

如果我想要的对象没有出现在响应中,UserEntity 用户; .

中可以包含除 null 之外的任何对象

很明显哪里不对,或者我觉得有更正确的用法

你能给我一些建议吗?

Optional 是一个 type-level 解决方案,用于表示可选值而不是空引用。所以理想情况下,当你使用 Optional 时,你可以有多个选项来避免空检查。例如,对于您的用例:

getUser().isPresent()

等同于(假设你的 getUser() 现在 return User 而不是 Optional)

getUser() != null

另外,Optional提供了很多方法(which is clearly stated in the documentation),尤其是函数式风格,方便处理是否包含实际值。

我倾向于按以下方式执行此操作:

每当我希望查询总是 return 恰好一条记录时,如果找不到该记录,则意味着存在意外问题,我将方法命名为 getSomething(...) 并使它 return 实体本身。

每当我希望查询 return 一条记录或什么都没有时,我将方法命名为 findSomething(...) 并使其成为 return Optional<...>.

getSomething(...)方法可以根据findSomething(...)方法来实现。像这样:

// Returns an empty Optional if there is no user with the given id
Optional<UserEntity> findUserById(long id) {
    return ...;
}

// Throws an EntityNotFoundException if there is no user with the given id
UserEntity getUserById(long id) {
    return findUserById(id).orElseThrow(
        () -> new EntityNotFoundException("No UserEntity found with id " + id));
}

您没有提供足够的上下文来给出有意义的具体答案。

对于用户来说,合理的用法可能是

UserEntity user = userRepo.getUser(userId).orElseGet(() -> userRepo.getGuestUser());

这真的取决于用例。