我正在开发 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!=null
与 Optional.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/