Java 8 在a和b是可选值的情况下,如何简洁地编写a | | b?
我对任何语言的答案都很满意,但我最终还是想要一个Java的答案。(Java 8+很好。不限于Java 8。我已尝试修复标记。) 如果我有两个Java 8 在a和b是可选值的情况下,如何简洁地编写a | | b?,java-8,functional-programming,optional,java-9,maybe,Java 8,Functional Programming,Optional,Java 9,Maybe,我对任何语言的答案都很满意,但我最终还是想要一个Java的答案。(Java 8+很好。不限于Java 8。我已尝试修复标记。) 如果我有两个可选值,我如何简洁地计算a | | b,意思是:a,如果已定义;否则b,如果已定义;否则empty() 可选a=。。。; 可选b=。。。; 可选aOrB=a | | b;//如何在Java8+中编写这个? 我知道我可以编写a.orElse(12),但是如果默认的“值”也是可选的怎么办 显然,在C#中,操作符?做了我想要的事情。在java-8中,我们没有任何
可选值
,我如何简洁地计算a | | b
,意思是:a
,如果已定义;否则b
,如果已定义;否则empty()
可选a=。。。;
可选b=。。。;
可选aOrB=a | | b;//如何在Java8+中编写这个?
我知道我可以编写a.orElse(12)
,但是如果默认的“值”也是可选的怎么办
显然,在C#中,操作符?
做了我想要的事情。在java-8
中,我们没有任何解决easy chain可选对象的方法,但您可以尝试:
Stream.of(a, b)
.filter(op -> op.isPresent())
.map(op -> op.get())
.findFirst();
在java9
中,您可以执行以下操作:
Optional<Integer> result = a.or(() -> b);
可选结果=a或(()->b);
在中,您可以执行以下任一操作:
✓ 只需使用将其链接为:-
Optional<Integer> a, b, c, d; // initialized
Optional<Integer> opOr = a.or(() -> b).or(() -> c).or(() -> d);
实施记录为-
如果存在值,则返回仅包含
否则返回一个空的流
可选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-8
How 8+?标签中的描述是特定的java8@ByeBye请看问题//中的代码,如何在Java 8+中编写此代码?好的,因此应该添加标记。我已经添加了有问题的标记。流是按默认值排序的。我正在考虑使用默认值为empty()的折叠isPresent(),@J.B.Rainsberger受你的折叠思想的启发,我想到了Stream.of(a,B).reduce(可选的.empty(),(opt1,opt2)->opt1.or(()->opt2))
。在Java9中,你还可以将你的第一个变体简化为Stream.of(a,B).flatMap(可选的::Stream).findFirst()
,这使得它很容易扩展到更多的选项…我希望有一个没有isPresent()
的解决方案,但这似乎是我们能做的最好的了。在我看来,只有两个变量时,这看起来最干净。但是当你有两个以上的时候,它看起来很混乱,而Java 9或
方法允许链接:a.or(()->b).或(()->c).或(()->d)
@DodgyCodeException,这个链对我来说也很混乱,超过两个,我会写一个专用的方法选项或(选项…选项)
处理that@DodgyCodeException:Stream.of(a,b,c,d)。flatMap(可选::Stream)。findFirst()
@Holger这是一个不错的例子,我们借用了它。感谢分享。可以使用番石榴Streams::stream
作为Java 9Optional::stream
Optional<Integer> aOrB = a.isPresent() ? a : b;
a.orElse(b.orElse(null));
Stream.of(a, b)
.flatMap(x ->
x.map(Stream::of)
.orElse(Stream.empty())
)
.findFirst()