如何使用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"));

当然,您可以为Optionoption1使用option2包装不同类型的值,或组合多个选项,而不仅仅是两个。您还可以为yield函数的返回值使用其他类型。为了简单起见,为了符合您的原始示例,我在各处都使用了String

我想补充一点,在一个或两个选项为空的情况下,我将尽量避免抛出NullPointerException。也许尝试使用Either之类的另一种vavr数据类型来表示这种错误情况?

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...