这是Java 8中Optional类型的有效(预期)用法吗?
String process(String s) { return Optional.ofNullable(s).orElseGet(this::getDefault); }
我会再摇摆一下。
这是有效用法吗?是的,从狭义上讲,它可以编译并产生您期望的结果。
这是预期用途吗?否。现在,有时候发现事情超出了最初的用途,如果行得通,那就太好了。但是对于Optional,我们发现通常情况下效果并不理想。
Optional
Optional在我们的JavaOne 2015演讲“ Java 8 Lambda和Streams的API设计”中 ,我和BrianGoetz讨论了一些问题:
的主要用途Optional如下:(幻灯片36)
Optional旨在为库方法 返回类型 提供 有限的 机制,在这种情况下,很明显需要表示“无结果”,并且使用该方法极 有可能导致错误 。 null
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时间更长,并且大多数人发现它比常规代码更加晦涩难懂。不仅如此,它还会无缘无故地产生额外的垃圾。
底线:仅仅因为您 可以 做某事并不意味着您 应该 做。