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.of 而不是 Optional.ofNullable?
Optional.ofNullable(参数1).orElse(参数2)
Optional.ofNullable(参数1).orElse(参数2)
如果我们将Optional.of方法设为私有,并且只允许Java中的Optional.ofNullable,该怎么办?除了向后兼容性会有什么问题吗?