微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用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数据类型来表示这种错误情况?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。