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

时间:2017-10-24 13:53:25

标签: java-8 functional-programming optional java-9 maybe

我对任何语言的答案感到满意,但我最终想要用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),但如果默认&#34;值&#34;也是Optional

显然,在C#中,运营商??做了我想做的事。

5 个答案:

答案 0 :(得分:9)

中,您可以执行以下任何操作:

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

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

实施记录为 -

  

如果存在值,则返回描述该值的Optional,   否则返回供应函数生成的Optional

✓另外,正如@Holger指出的那样,使用 stream 作为: -

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

实施记录为 -

  

如果存在值,则返回仅包含的序列Stream   该值,否则返回空Stream

答案 1 :(得分:8)

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

答案 2 :(得分:7)

java-8中,我们没有简单链Optional对象的任何解决方案,但您可以尝试使用:

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

java9中你可以这样做:

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

答案 3 :(得分:0)

嗨,你可以这样做。

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

答案 4 :(得分:0)

java-8 Optional::stream如果你想要一些接近Stream.of(a, b) .flatMap(x -> x.map(Stream::of) .orElse(Stream.empty()) ) .findFirst() 机制的东西,你可以做到

=IIF(Count(Fields!opportunity_name.Value) > 0, "AccountDetailReport", Nothing)