var input = Tuple(Some(1), Some(2));
我想使用Vavr的match表达式获取整数
1
和2
;这是我目前的做法:import static io.vavr.API.*;
import static io.vavr.Patterns.$Some;
import static io.vavr.Patterns.$Tuple2;
var output = Match(input).of(
Case($Tuple2($Some($()), $Some($())),
(fst, snd) -> fst.get() + "/" + snd.get()),
Case($(), "No match")
);
这可以工作并返回
"1/2"
,但是让我担心,因为我在两个get
上调用了不安全的Some
方法。我宁愿用match表达式将
input
分解到提取最里面的整数的地步。Vavr的用户指南中的此注释使我怀疑是否可行:
⚡Vavr的Match API的第一个原型允许从匹配模式中提取用户定义的对象选择。没有适当的编译器支持,这是不切实际的,因为生成的方法数量呈指数爆炸式增长。当前的API做出了妥协,即所有模式都匹配,但只有根模式才被分解。
但是我仍然很好奇是否存在一种更优雅,类型安全的方法来分解嵌套值
input
。 最佳答案
我将通过以下方式将Tuple.apply
(*)与API.For
(*)结合使用:
var output = input.apply(API::For)
.yield((i1, i2) -> i1 + "/" + i2)
.getOrElse("No match");
(*):提供了指向两个参数重载的链接以符合您的示例