gpt4 book ai didi

java - 如何使用 Vavr 在 Java 中模式匹配具有定义类型的 Option 元组

转载 作者:行者123 更新时间:2023-12-04 13:33:18 28 4
gpt4 key购买 nike

新的 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) 会发生同样的错误在图案中。
我确信这只是正确语法的问题,但我正在努力寻找正确的文档。
我哪里错了?
谢谢

最佳答案

有一个称为理解的 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如果其中一个或两个选项为空。也许尝试使用另一种 vavr 数据类型,如 Either代表这样的错误情况?

关于java - 如何使用 Vavr 在 Java 中模式匹配具有定义类型的 Option 元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63720606/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com