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
。
答案 0 :(得分:2)
我将通过以下方式将Tuple.apply
(*)与API.For
(*)结合使用:
var output = input.apply(API::For)
.yield((i1, i2) -> i1 + "/" + i2)
.getOrElse("No match");
(*):提供了两个参数重载的链接以符合您的示例