我对任何语言的答案感到满意,但我最终想要用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#中,运营商??
做了我想做的事。
答案 0 :(得分:9)
在java-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)