我会再摇摆一下。
这是有效用法吗?是的,从狭义上讲,它可以编译并产生您期望的结果。
这是预期用途吗?否。现在,有时候发现事情超出了最初的用途,如果行得通,那就太好了。但是对于
Optional,我们发现通常情况下效果并不理想。
Optional在我们的JavaOne
2015演讲“ Java 8 Lambda和Streams的API设计”中 ,我和BrianGoetz讨论了一些问题:
- 链接到视频
- 链接到幻灯片
的主要用途
Optional如下:(幻灯片36)
Optional旨在为库方法 返回类型 提供 有限的 机制,在这种情况下,很明显需要表示“无结果”,并且使用该方法极 有可能导致错误 。
null
链接方法的能力
Optional无疑非常酷,并且在某些情况下,它减少了条件逻辑带来的混乱。但是很多时候这是行不通的。一个典型的代码味道是不是使用方法链接的代码,
处理 的
Optional一些方法返回,它 创建了
一个
Optional从东西是空的,以连锁方式,避免条件语句。这是一个实际应用的示例(同样来自我们的演示,幻灯片42):
// BADString process(String s) { return Optional.ofNullable(s).orElseGet(this::getDefault);}// GOODString process(String s) { return (s != null) ? s : getDefault();}使用该方法的
Optional时间更长,并且大多数人发现它比常规代码更加晦涩难懂。不仅如此,它还会无缘无故地产生额外的垃圾。
底线:仅仅因为您 可以 做某事并不意味着您 应该 做。



