使用Vavr的类型,我创建了一对Some

var input = Tuple(Some(1), Some(2));


我想使用Vavr的match表达式获取整数12;这是我目前的做法:

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");


(*):提供了指向两个参数重载的链接以符合您的示例

09-10 14:30