Optional.ofNullable(i).ifPresent... 与 if (i != null) 的区别

10

最近我看到一篇博客文章由@java推特),建议以下代码正在变得越来越普遍:

Optional.ofNullable(i).ifPresent(x -> doBlah(x));

改为:

if (i != null) {
  doBlah(i);
}

在这种情况下,Optional的使用对我来说似乎非常笨拙,即使忽略变量的命名 - 后者更易于阅读并且更符合用例(处理空值)。我相信这也更好地捕捉了语义 - i 可能来自不遵循Optional试图捕捉的语义的代码(如可能的重复项此Oracle文章中所描述的那样)。
我没有看到任何一个好的语义原因可以优先选择Optional.isNullable方法(忽略它可能具有的性能影响,这取决于其如何使用)吗?

1
http://stackoverflow.com/documentation/java/152/optional - shmosel
1
你提供的这两段代码在逻辑上是不同的。第一段代码似乎试图在i为空时调用doBla(尽管我认为它不正确)。而第二段代码则在i不为空时调用doBla - khelwood
1
应该使用“ifPresent”,而不是“orElse”。否则就没有任何意义。 - khelwood
4
IMO: "Optional"不应该被这样使用。如果这种用法变得越来越普遍,那么就像所有的朋友都往桥上跳一样,你是否也要跟着跳呢? - erickson
1
@JoeC 我认为这个问题并不基于个人观点,因为所给的示例并不是 Optional 的实际预期用法。 - Kylos
显示剩余5条评论
1个回答

25

将可能为空的对象包装在Optional中,仅为了在其上调用ifPresent()并不是很有意义。

更有用的情况是,API可以返回null对象,而应该返回Optional。这强制调用者以空安全方式处理潜在的空结果。由于API和调用者是独立的代码单元,因此将对象包装在Optional中并强制调用者调用ifPresent()的额外工作不仅是忙碌的工作,而且实际上强制执行更安全的合同,以防止空指针异常。


7
确实,Optional 的设计初衷就是作为返回值使用。 - erickson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接