我如何简洁地写一个 || 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);
在 java-9 中,您可以关注以下任何一项:
✓ 只需使用 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()
我对任何语言的答案都很满意,但我最终想要 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);
在 java-9 中,您可以关注以下任何一项:
✓ 只需使用 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 anOptional
produced by the supplying function.
✓ 或者如 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 emptyStream
.
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()