如何对空的Optional执行空检查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对空的Optional执行空检查相关的知识,希望对你有一定的参考价值。

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

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

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

.findById()文档说,该功能将...

如果没有找到,则返回具有给定id或Optional#empty()的实体

那么我目前的实施与null-check按预期工作?或者我必须检查以下内容:

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

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

通过引入空虚概念来创建可选项,以消除对空检查的需要。

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

这基本上是由以下几点:

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

一个很好实现的方法(如上所述)将返回带值的可选项或空的Optional(如文档中所述)。

Optionals提供了大量的方法,您可以操作它们而无需进行空白检查。

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

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

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

另外你可以使用映射函数等。

我建议您仔细阅读文档以获取更多信息。

另一答案

那么我当前的实现是否使用null检查按预期工作?

不是。就像方法所说,它返回实体,或Optional.empty;它不会返回null

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

另一答案

创建Optionals是为了删除该字段上的null检查,并对该字段执行操作而不必将其置为空。

如果Optional.isPresent()包含任何值,您可以在最后查看。

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

以上是关于如何对空的Optional执行空检查的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 用 Optional 替换两个空检查

解构可为空的对象

颤振错误,对空值使用空检查运算符

在 dispose() 调用提供程序时“对空值使用空检查运算符”

Laravel - 防止对空输入进行验证检查

Swift-可空链式调用(Optional Chaining)(十五)