Optional.ofNullable(i).ifPresent... 与 if (i != null) [重复]

Posted

技术标签:

【中文标题】Optional.ofNullable(i).ifPresent... 与 if (i != null) [重复]【英文标题】:Optional.ofNullable(i).ifPresent... vs if (i != null) [duplicate] 【发布时间】:2017-07-06 05:49:53 【问题描述】:

我最近看到blog post (tweeted by @java) 表明以下代码变得越来越普遍:

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

代替:

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

在这种情况下使用 Optional 对我来说似乎很尴尬,甚至忽略了变量的命名 - 后者更容易阅读并且更适合用例(处理空值)。我相信这也能更好地捕捉语义——我可能来自不符合 Optional 试图捕捉的语义的代码(如 possible duplicate 和 this Oracle article 中所述)。

我没有看到,但是有一个好的语义原因更喜欢 Optional.isNullable 方法(忽略它可能产生的性能影响,具体取决于它的使用方式)?

【问题讨论】:

orElse(x->doBla(x)) 不正确,除非 i 恰好是一个 lambda。 oracle.com/technetwork/articles/java/… ***.com/documentation/java/152/optional 是的,对于您引用的案例,我会坚持使用旧的 if 声明。但你可以做一些neat tricks with filtering and mapping optionals IMO:可选不应以这种方式使用。如果它变得越来越普遍,好吧,如果你所有的朋友都从桥上跳下来...... 【参考方案1】:

相同的代码单元将一个可能为 null 的对象包装在 Optional 中只调用 ifPresent() 并没有多大意义。

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

【讨论】:

是的,确实,这就是 Optional 的设计用途:作为返回值。

以上是关于Optional.ofNullable(i).ifPresent... 与 if (i != null) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Optional.ofNullable()方法使用

Optional.ofNullable()方法使用

为啥使用 Optional.of 而不是 Optional.ofNullable?

Optional.ofNullable(参数1).orElse(参数2)

Optional.ofNullable(参数1).orElse(参数2)

如果我们将Optional.of方法设为私有,并且只允许Java中的Optional.ofNullable,该怎么办?除了向后兼容性会有什么问题吗?