如何用Vavr模式匹配Java中定义类型的选项元组

如何用Vavr模式匹配Java中定义类型的选项元组,java,pattern-matching,vavr,Java,Pattern Matching,Vavr,这里是新的Vavr用户。 我试图对选项的元组进行模式匹配,以执行语句(如果两者都是某些语句),在Scala中,我会使用以下方法: val maybeThis: Option[String] = ??? val maybeThat: Option[String] = ??? (maybeThis, maybeThat) match { case (Some(dis), Some(that)) => ??? case _ => ??? } 在Java中,我尝试以下方法: Tu

这里是新的Vavr用户。 我试图对选项的元组进行模式匹配,以执行语句(如果两者都是某些语句),在Scala中,我会使用以下方法:

val maybeThis: Option[String] = ???
val maybeThat: Option[String] = ???

(maybeThis, maybeThat) match {
  case (Some(dis), Some(that)) => ???
  case _ => ???
}
在Java中,我尝试以下方法:

Tuple2<Option<String>, Option<String>> tuple = new Tuple2<>(Option.of(...), Option.of(...));

return Match(tuple).of(
  Case($Tuple2($Some($(instanceOf(String.class))), $Some($(instanceOf(String.class)))),
                    (someThis, someThat) -> methodWhichEatsTwoStrings(someThis.get(), someThat.get())),
  Case($(), t -> run(() -> {
                throw new NullPointerException(...);
            })));
Tuple2 tuple=newtuple2(Option.of(…),Option.of(…);
返回匹配(元组).of(
Case($Tuple2($Some($(instanceOf(String.class)),$Some($(instanceOf(String.class))),
(someThis,someThis)->methodwhichactstwostrings(someThis.get(),someThis.get()),
案例($(),t->run(()->{
抛出新的NullPointerException(…);
})));
然而,对于这个实现,编译器抱怨说它期望的是
Some
,而不是
Some
,如果我在模式中省略
$(instanceOf(String.class)
,同样的错误也会发生

我有点确信这只是一个正确语法的问题,但我正在努力找到正确的文档。 我错在哪里?
感谢

有一个名为“理解”的vavr API构造,它试图模仿Scala的理解,以达到在Java中可以实现的程度。使用该构造,您可以非常优雅地解决问题。有关详细信息,请参阅。下面是一个示例代码片段:

String methodWhichEatsTwoStrings(String v1, String v2) {
    return v1 + v2; //combine the two values in some way
}

...

Option<String> option1 = Option.some("value1");
Option<String> option2 = Option.some("value2");

String combined = For(option1, option2)
    .yield((v1, v2) -> methodWhichEatsTwoStrings(v1, v2))
    .getOrElseThrow(() -> new NullPointerException("reasons"));
String方法whicheatchstwostrings(stringv1,stringv2){
返回v1+v2;//以某种方式组合这两个值
}
...
选项1=选项。部分(“值1”);
选项2=选项。部分(“值2”);
字符串组合=用于(选项1、选项2)
.yield((v1,v2)->methodwhicheatchstwostrings(v1,v2))
.getorelsetrow(()->新的NullPointerException(“原因”);
当然,您可以为
option1
option2
使用不同类型的
Option
包装值,或者组合多个选项,而不仅仅是两个。您也可以为
yield
函数的返回值使用不同的类型。为了简单起见,我在任何地方都使用了
String
符合你最初的例子

我想补充一点,如果其中一个或两个选项都为空,我会尽量避免抛出
NullPointerException
。也许可以尝试使用另一种vavr数据类型,如
,来表示这种错误情况