我如何简洁地写一个 || b 其中 a 和 b 是可选值?

How do I concisely write a || b where a and b are Optional values?

我对任何语言的答案都很满意,但我最终想要 Java 的答案。 (Java 8+ 可以。不限于 Java 8。我已尝试修复标签。)

如果我有两个 Optional<Integer> 值,我如何简洁地计算 a || b 的等价物,意思是:a,如果已定义;否则 b,如果已定义;否则 empty()?

Optional<Integer> a = ...;
Optional<Integer> b = ...;
Optional<Integer> aOrB = a || b; // How to write this in Java 8+?

我知道我可以写a.orElse(12),但是如果默认的"value"也是Optional呢?

显然,在 C# 中,运算符 ?? 做了我想要的。

java-8 中,我们没有任何解决方案可以轻松链接 Optional 对象,但您可以尝试:

Stream.of(a, b)
    .filter(op -> op.isPresent())
    .map(op -> op.get())
    .findFirst();

java9 你可以做:

Optional<Integer> result = a.or(() -> b);

中,您可以关注以下任何一项:

✓ 只需使用 or 将其链接为 :-

Optional<Integer> a, b, c, d; // initialized
Optional<Integer> opOr = a.or(() -> b).or(() -> c).or(() -> d);

实现记录为 -

If a value is present, returns an Optional describing the value, otherwise returns an Optional produced by the supplying function.


✓ 或者如 , use the stream 所指出的那样:-

Optional<Integer> opOr = Stream.of(a, b, c, d).flatMap(Optional::stream).findFirst();

实现记录为 -

If a value is present, returns a sequential Stream containing only that value, otherwise returns an empty Stream.

Optional<Integer> aOrB =  a.isPresent() ? a : b;

你好,你可以这样做。

a.orElse(b.orElse(null));

java-8 中,如果你想要接近 Optional::stream 机制的东西,你可以做

Stream.of(a, b)
  .flatMap(x -> 
     x.map(Stream::of)
      .orElse(Stream.empty())
  )
  .findFirst()