如何用vavr模式匹配java中已定义类型的option元组

ecbunoof  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(413)

这里有新的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) 在模式中。
我可以肯定这只是一个正确语法的问题,但是我正在努力找到正确的文档。我错在哪里?谢谢

hrysbysz

hrysbysz1#

有一个VAVRAPI构造叫做理解,它试图模仿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"));

当然,你可以用 Option Package 不同类型的值 option1 以及 option2 ,或组合多个选项,而不仅仅是两个。您还可以为 yield 功能也一样。我曾经 String 到处都是为了简单和符合你原来的例子。
我想补充一点,我会尽量避免扔东西 NullPointerException 如果一个或两个选项都为空。可能尝试使用另一种vavr数据类型,如 Either 代表这样一个错误案例?

相关问题