从一个或另一个 Optional 中获取价值

新手上路,请多包涵

我有两个 java.util.Optional 实例,我想得到一个 Optional 要么:

  • 具有第一个 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;
}

原文由 Feuermurmel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 430
2 个回答

Java 9 及更高版本:

 firstOptional.or(() -> secondOptional);

Java 8 及以下

如果你想避免提及 firstOptional 两次,你可能不得不使用类似的东西

firstOptional.map(Optional::of).orElse(secondOptional);

或者

Optional.ofNullable(firstOptional.orElse(secondOptional.orElse(null)));

但最可读的变体可能是简单地做

Optional<...> opt = firstOptional.isPresent()  ? firstOptional
                  : secondOptional.isPresent() ? secondOptional
                  : Optional.empty();


如果有人偶然发现这个问题但有一个可选 _列表_,我会建议类似

Optional<...> opt = optionals.stream()
                             .filter(Optional::isPresent)
                             .findFirst()
                             .orElse(Optional.empty());

原文由 aioobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

编辑: 我完全以为你最初使用的是 Guava 的 Optional 。我更新了我的答案,为它们各自的 Optional 类提供 Guava 和 Java 8 语法。

Java 8 可选

您可以将其缩短为:

 firstOptional.orElse(secondOptional.orElse(EMPTY_VALUE))

我不确定您在第三个项目符号中所说的“空”是什么意思。如果你的意思是 null 那么这就可以了:

 firstOptional.orElse(secondOptional.orElse(null))

orElse()Optional 上的一个方法,它将返回值(如果存在),否则它将返回您作为参数提供给 orElse() 的值。

番石榴可选

您可以将其缩短为:

 firstOptional.or(secondOptional.or(EMPTY_VALUE))

我不确定您在第三个项目符号中所说的“空”是什么意思。如果你的意思是 null 那么这就可以了:

 firstOptional.or(secondOptional.orNull())

or()Optional 上的一个方法,它将返回值(如果存在),否则它将返回您作为参数提供给 or() 的值。

原文由 Erik Gillespie 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题