Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 在a和b是可选值的情况下,如何简洁地编写a | | b?_Java 8_Functional Programming_Optional_Java 9_Maybe - Fatal编程技术网

Java 8 在a和b是可选值的情况下,如何简洁地编写a | | b?

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中,我们没有任何

我对任何语言的答案都很满意,但我最终还是想要一个Java的答案。(Java 8+很好。不限于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 9
Optional::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()