java - 检查可选对象是否不为空且为空

标签 java java-8 null option-type nullable

我正在开发 sprint 启动应用程序,并且正在开发 SonarQube 拦截器来解决问题。

所以我有一个问题需要解决:

Ensure this "Optional" could never be null and remove this null-check.

所以我改变了条件

myObj != null -> Optional.ofNullable(myObj).isPresent()

我无法使用myObj.isPresent()直接为myObj可以是null ,所以它会抛出空指针。

现在我陷入了一种情况:myObj为空

myObj= Optional.empty();
Optional.ofNullable(myObj).isPresent(); // True
myObj.isPresent(); // False;

正如我所提到的,我已经更改了我的条件检查 myObj!=nullOptional.ofNullable(myObj).isPresent() ,它适用于 null对象,如果对象为空,则空对象为真,当我访问 get() 时在对象上,它会抛出:不存在任何值

如何避免null在一种情况下在一起?

我不想添加 && 条件来检查 myObj 是否为非空:

Optional.ofNullable(myObj).isPresent() && !myObj.isEmpty()

我可以使用单个语句来检查 null 以及空,反之亦然吗?

最佳答案

可选类型,它在 JDK 中引入仅用于一个特定目的 - 当返回值可能很好时用作返回类型null。任何其他情况下,使用可选只是为了链接它,或者作为参数或字段的类型,都不被认为是一个好的做法。

您绝对不应该将 Optional 对象与另一个 Optional 对象一起包装。

事实上,您有一个可能为 null 的可选项本身并不是一个好的指标。它从一开始就不应该发生。因此,您几乎无法想出一个干净而优雅的解决方案。

访问该值不是实际问题,问题是您的可选值可能为null。不应该是这样,您不能返回 null 而不是 可选。这是经验法则。

您可以使用其中任何一个,但请记住,它并不能消除问题,而是掩盖问题:

if (Stream.ofNullable(myObj).anyMatch(Optional::isPresent)) {
    something = myObj.get();
}
something = Stream
        .ofNullable(myObj)
        .filter(Optional::isPresent)
        .findFirst().orElse(defaultValue);

您的问题描述如下:

Ensure this "Optional" could never be null and remove this null-check.

据我了解,您必须解决问题的根源:找出 null options 的来源并替换 null 带有一个空可选

关于java - 检查可选对象是否不为空且为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71614826/

相关文章:

sql - 为什么 FULL JOIN 顺序在这些查询中有所不同?

java - 为什么 Java 说这些类型不兼容?

java - 使用 "javaw.exe"与 "java.exe"的堆大小使用情况

java - Log4j2 导致 PreferIP6 失败

java - 替代 Java 8 中的 MoreObjects

c - 语句 "Rust won' t convert integers to references"是什么意思?

java - 拦截对数据库的查询

java - 对象类和数组 - 为什么它返回 'null' ? [java]

Java8 列表返回元素或 null

JavaScript 在 CRM 2011 字段中显示单词 "null",无值