一尘不染

Java 8中Optional类型的有效用法

java

这是Java 8中Optional类型的有效(预期)用法吗?

String process(String s) {
    return Optional.ofNullable(s).orElseGet(this::getDefault);
}

阅读 196

收藏
2020-12-03

共1个答案

一尘不染

我会再摇摆一下。

这是有效用法吗?是的,从狭义上讲,它可以编译并产生您期望的结果。

这是预期用途吗?否。现在,有时候发现事情超出了最初的用途,如果行得通,那就太好了。但是对于Optional,我们发现通常情况下效果并不理想。

Optional在我们的JavaOne
2015演讲“ Java 8 Lambda和Streams的API设计”中 ,我和BrianGoetz讨论了一些问题:

的主要用途Optional如下:(幻灯片36)

Optional旨在为库方法 返回类型 提供 有限的 机制,在这种情况下,很明显需要表示“无结果”,并且使用该方法极 有可能导致错误
null

链接方法的能力Optional无疑非常酷,并且在某些情况下,它减少了条件逻辑带来的混乱。但是很多时候这是行不通的。一个典型的代码味道是不是使用方法链接的代码,
处理Optional一些方法返回,它 创建了
一个Optional从东西是空的,以连锁方式,避免条件语句。这是一个实际应用的示例(同样来自我们的演示,幻灯片42):

// BAD
String process(String s) {
    return Optional.ofNullable(s).orElseGet(this::getDefault);
}

// GOOD
String process(String s) {
    return (s != null) ? s : getDefault();
}

使用该方法的Optional时间更长,并且大多数人发现它比常规代码更加晦涩难懂。不仅如此,它还会无缘无故地产生额外的垃圾。

底线:仅仅因为您 可以 做某事并不意味着您 应该 做。

2020-12-03