如何对空的 Optional 执行 null 检查

How to performe a null-check for an empty Optional

我目前正在使用一些存储库函数,例如 .findById()。现在我想检查是否为请求的 ID 返回了一个条目。我目前正在通过执行 null-检查来做到这一点。

Optional<Entry> entryOptional = entryRepository.findById(id);

if (entryOptional != null) {
  // do sth. ...
}

.findById() 文档说,该函数将...

return the entity with the given id or Optional#empty() if none found

那么我当前使用 null-check 的实现是否按预期工作?或者我是否必须检查类似的内容:

if (!entryOptional.isEmpty()) {
  // do sth. ...
}

So is my current implementation with the null-check working as expected?

没有。正如方法所说,它 return 是实体,或 Optional.empty;它不 return null.

你的第二个版本是正确的。

检查可选项是否为 null 本质上是错误的。

创建可选项是为了通过引入空的概念来否定空检查的需要。

本质上,可选值是一个值的包装器,它可以有两个状态。要么有值,要么为空。这是通过使用 Optional#isPresent 完成的。您可以在相关文档 here.

上查看更多信息

它的主要作用如下:

public boolean isPresent() {
    return value != null;
}

一个很好实现的方法(如你上面提到的那个)将 return 一个带有值的可选或一个空的可选(如文档中提到的)。

Optionals 提供了大量的方法,你可以在不需要空检查的情况下操作它们。

例如,在您的代码中您可以:

entryRepository.findById(id).ifPresent(() -> {
   //some operation
});

它基本上接受消费者并在可选值不为 null 的情况下执行它。

您可以使用映射函数等替代方案

我建议你多看看文档。

创建

Optionals 是为了删除对该字段的 null 检查并对该字段执行操作而不关心它是否为空。

你可以在最后用Optional.isPresent()检查它是否包含任何值。

所以是的,你的第二种方法是正确的。