使用Vavr在Tuple内匹配选项

时间:2019-06-08 09:15:44

标签: java pattern-matching vavr

使用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

1 个答案:

答案 0 :(得分:2)

我将通过以下方式将Tuple.apply (*)API.For (*)结合使用:

var output = input.apply(API::For)
    .yield((i1, i2) -> i1 + "/" + i2)
    .getOrElse("No match");

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