J. *_*ger 10 functional-programming optional maybe java-8 java-9
我对任何语言的答案感到满意,但我最终想要用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+?
Run Code Online (Sandbox Code Playgroud)
我知道我可以写a.orElse(12)
,但如果默认的"值"也是Optional
怎么办?
显然,在C#中,运营商??
做了我想要的.
在java-9中,您可以遵循以下任何一项:
✓只需使用以下链接链接or
: -
Optional<Integer> a, b, c, d; // initialized
Optional<Integer> opOr = a.or(() -> b).or(() -> c).or(() -> d);
Run Code Online (Sandbox Code Playgroud)
实施记录为 -
如果存在
Optional
值,则返回描述该值的值,否则返回Optional
由赋值函数生成的值.
✓或者如@Holger指出的那样,使用stream
as: -
Optional<Integer> opOr = Stream.of(a, b, c, d).flatMap(Optional::stream).findFirst();
Run Code Online (Sandbox Code Playgroud)
实施记录为 -
如果存在
Stream
值,则返回仅包含该值的顺序,否则返回空值Stream
.
Optional<Integer> aOrB = a.isPresent() ? a : b;
Run Code Online (Sandbox Code Playgroud)
在java-8
我们没有任何简单链Optional
对象的解决方案,但你可以尝试:
Stream.of(a, b)
.filter(op -> op.isPresent())
.map(op -> op.get())
.findFirst();
Run Code Online (Sandbox Code Playgroud)
在java9
你可以做:
Optional<Integer> result = a.or(() -> b);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
445 次 |
最近记录: |