如何用Vavr模式匹配Java中定义类型的选项元组
这里是新的Vavr用户。 我试图对选项的元组进行模式匹配,以执行语句(如果两者都是某些语句),在Scala中,我会使用以下方法:如何用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
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数据类型,如或
,来表示这种错误情况