使用 Vavr 匹配元组内的选项

Match on Options inside Tuple with Vavr

使用 Vavr's types, I have created a pair of Somes:

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

我想使用 Vavr 的匹配表达式得到整数 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")
);

这有效并且 returns "1/2" 但让我担心,因为我在两个 Some 上调用了不安全的 get 方法。

我宁愿让匹配表达式分解 input 到它提取最里面的整数的程度。

Vavr 用户指南中的这条注释让我怀疑这是否可行:

⚡ A first prototype of Vavr’s Match API allowed to extract a user-defined selection of objects from a match pattern. Without proper compiler support this isn’t practicable because the number of generated methods exploded exponentially. The current API makes the compromise that all patterns are matched but only the root patterns are decomposed.

但我仍然很好奇是否有更优雅、类型安全的方法来分解嵌套值 input

我会按以下方式使用 Tuple.apply(*) combined with API.For(*)

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

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