如何解决如何使用Vavr模式匹配Java中定义类型的Option元组
新的Vavr用户在这里。 我正在尝试对选项的元组进行模式匹配以执行一条语句(如果它们都为Some),那么在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)
,也会发生相同的错误。
我可以肯定地说这只是语法正确的问题,但我一直在努力寻找正确的文档。 我哪里错了? 谢谢
解决方法
有一个名为 for comprehension 的vavr API构造,该构造试图在Java可能的范围内模仿Scala的理解。使用该构造,您可以相当优雅地解决您的问题。有关更多详细信息,请参见For overload for handling two Options。这是一个示例代码片段:
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"));
当然,您可以为Option
和option1
使用option2
包装不同类型的值,或组合多个选项,而不仅仅是两个。您还可以为yield
函数的返回值使用其他类型。为了简单起见,为了符合您的原始示例,我在各处都使用了String
。
我想补充一点,在一个或两个选项为空的情况下,我将尽量避免抛出NullPointerException
。也许尝试使用Either
之类的另一种vavr数据类型来表示这种错误情况?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。