我有两个java.util.Optional
实例,我想得到一个Optional
要么:
- 具有第一个可选值(如果它有值)。
- 具有第二个可选值(如果它有值)。
- 为空,Optional 都没有值。
有没有一种直接的方法可以做到这一点,即是否已经有一些 API 可以做到这一点?
下面的表达式可以做到这一点,但我必须提到第一个可选两次:
firstOptional.isPresent() ? firstOptional : secondOptional
这正是com.google.common.base.Optional.or()
确实如此,但 Java 8 的 API 中不存在该方法。
接受的答案aioobe列出了一些替代方法来克服这一遗漏Optional
API就在必须计算这样的值的地方(这回答了我的问题)。我现在选择向我的代码库添加一个实用函数:
public static <T> Optional<T> or(Optional<T> a, Optional<T> b) {
if (a.isPresent())
return a;
else
return b;
}
Java 9 及以上版本:
firstOptional.or(() -> secondOptional);
Java 8 及以下版本
如果你想避免提及firstOptional
两次,你可能不得不选择类似的东西
firstOptional.map(Optional::of).orElse(secondOptional);
or
Optional.ofNullable(firstOptional.orElse(secondOptional.orElse(null)));
但最易读的变体可能是简单地做
Optional<...> opt = firstOptional.isPresent() ? firstOptional
: secondOptional.isPresent() ? secondOptional
: Optional.empty();
如果有人偶然发现这个问题但有一个list的选项,我建议类似
Optional<...> opt = optionals.stream()
.filter(Optional::isPresent)
.findFirst()
.orElse(Optional.empty());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)