这里有新的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(...);
})));
然而,对于这个实现,编译器抱怨它期望 Some<Object>
而不是 Some<String>
,如果省略 $(instanceOf(String.class)
在模式中。
我可以肯定这只是一个正确语法的问题,但是我正在努力找到正确的文档。我错在哪里?谢谢
1条答案
按热度按时间hrysbysz1#
有一个VAVRAPI构造叫做理解,它试图模仿scala的理解,达到java中可以做到的程度。有了这个结构,你可以很优雅地解决你的问题。有关更多详细信息,请参阅有关处理两个选项的重载的。下面是一个示例代码段:
当然,你可以用
Option
Package 不同类型的值option1
以及option2
,或组合多个选项,而不仅仅是两个。您还可以为yield
功能也一样。我曾经String
到处都是为了简单和符合你原来的例子。我想补充一点,我会尽量避免扔东西
NullPointerException
如果一个或两个选项都为空。可能尝试使用另一种vavr数据类型,如Either
代表这样一个错误案例?