Optional用于表示可空对象,该类的一些用途包括:
- 作为方法返回类型,作为返回null的替代方案,表示没有可用值。
- 区分“未知”(例如,在地图中不存在)和“已知没有值”的情况(在地图中存在,并带有值Optional.absent())。
- 将可空引用包装为集合中的存储对象,该集合不支持null(虽然有几种其他方法也应该首先考虑)。
对于第一种情况,我是否需要在所有可为空的返回方法中返回Optional?
Optional用于表示可空对象,该类的一些用途包括:
对于第一种情况,我是否需要在所有可为空的返回方法中返回Optional?
那么 Optional 有什么问题吗?
我们所面临的问题是:JDK 8 Optional 对象是否会消除空引用?答案是强烈的否定!因此,反对者立刻质疑其价值,问道:那么它有什么用处,我们不能通过其他方式达到呢?
与 SML 或 Haskell 等函数式语言从未存在过 null 引用的情况不同,在 Java 中,我们无法简单地摆脱历史遗留下来的 null 引用。这将继续存在,并且他们可谓有其适当的用途(只是举个例子:三值逻辑)。
我怀疑 Optional 类的意图并非替换每个可为空的引用,而是帮助创建更健壮的 API,使我们可以通过读取方法签名来判断是否可以期望一个可选值,并强制程序员相应地使用该值。但最终,Optional 将只是另一个引用,并受到语言中每个其他引用的同样弱点的影响(例如,您可以返回一个 null Optional)。很明显,Optional 不会拯救这一天。
这些可选对象在Java中的使用方式以及它们是否有价值一直是项目lambda邮件列表中激烈辩论的话题。从反对者那里我们听到了一些有趣的论点,比如:java.util.Optional
的一个令人恼火的问题是它没有提供像 orElse(Optional<T>): Optional<T>
这样的方法,但是在另一方面,com.google.common.base.Optional
中定义了这个方法:or(Optional<T>): Optional<T>
。缺乏这个特定功能限制了Java 8的Optional的单子应用。or(Optional<T>)
复制为Java 8 Optional中的形式。
optionalA.map(Optional::of).orElse(optionalB)
或者
optionalA.map(Optional::of).orElseGet(() -> computeOptionalB)
更新:
在Java 9中(终于!)你可以使用Optional.or(Supplier<Optional<T>>)
:
optionalA.or(() -> computeOptionalB)
很棒!
opt.flatMap(fn)
相当于 opt.isPresent()?fn.apply(opt.value):opt
,而 opt.orElse(opt2)
则相当于 opt.isPresent()?opt:opt2
。你能发现它们之间的区别吗? - Vladjava.util.Optional
中有T orElse(T other)
方法。https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#orElse-T- - Adam Siemion