使用 Vavr 匹配元组内的选项
Match on Options inside Tuple with Vavr
使用 Vavr's types, I have created a pair of Some
s:
var input = Tuple(Some(1), Some(2));
我想使用 Vavr 的匹配表达式得到整数 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")
);
这有效并且 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");
(*):提供两个参数重载的链接以符合您的示例
使用 Vavr's types, I have created a pair of Some
s:
var input = Tuple(Some(1), Some(2));
我想使用 Vavr 的匹配表达式得到整数 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")
);
这有效并且 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");
(*):提供两个参数重载的链接以符合您的示例