从一个可选或另一个中获取值

2022-08-31 15:55:10

我有两个实例,我想得到一个:java.util.OptionalOptional

  • 具有第一个可选的值(如果它具有值)。
  • 具有第二个“可选”的值(如果它具有值)。
  • 都不为空 可选 具有值。

有没有一种直截了当的方法可以做到这一点,即是否已经有一些API可以做到这一点?

以下表达式将执行此操作,但我不得不提到第一个可选两次:

firstOptional.isPresent() ? firstOptional : secondOptional

这正是这样做的,但这种方法在Java 8的API中不存在。com.google.common.base.Optional.or()


aioobe接受的答案列出了一些替代方法,以克服必须计算此类值的API权利的省略(这回答了我的问题)。我现在选择在我的代码库中添加一个实用程序函数:Optional

public static <T> Optional<T> or(Optional<T> a, Optional<T> b) {
    if (a.isPresent())
        return a;
    else
        return b;
}

答案 1

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());

答案 2

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

Java 8 可选

您可以将其缩短到以下位置:

firstOptional.orElse(secondOptional.orElse(EMPTY_VALUE))

我不确定你在第三个项目符号中所说的“空”是什么意思。如果你的意思是空,那么这将做这个技巧:

firstOptional.orElse(secondOptional.orElse(null))

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

番石榴 可选

您可以将其缩短到以下位置:

firstOptional.or(secondOptional.or(EMPTY_VALUE))

我不确定你在第三个项目符号中所说的“空”是什么意思。如果你的意思是空,那么这将做这个技巧:

firstOptional.or(secondOptional.orNull())

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


推荐