java - Vavr中列表上的模式匹配对象分解
问题描述
是否有任何选项可以在 vavrs 集合上应用对象分解?
即来自scala的类似代码片段的东西:
val x = List(1, 2, 3)
val t = x match {
case List(a, b, c) => (a, b, c)
}
(在本例中,我们将列表转换为元组)
我在这里看到了一些与我的案例类似的示例https://github.com/vavr-io/vavr/issues/1157但看起来当前的语法不同,甚至是不可能的。
解决方案
Vavr 列表与许多函数式程序一样,由头部(单个元素,称为 Cons)和尾部(另一个列表)组成,但可以匹配第一个元素(不是最后一个,除非通过反转列表)这将比 Scala/Haskell 更冗长。此外,虽然您可以 MATCH 前 3 个元素,但您只能捕获第一个:
var t = Match(x).of(
Case($Cons($(), $Cons($(), $Cons($(), $()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))
);
当前的 API 做出了妥协,即所有模式都匹配,但只分解了根模式。
编辑:如果您想要列表中的 3 个元素,那么您需要确保第三个元素之后的尾部是一个空列表(称为 Nil):
var t = Match(x).of(
Case($Cons($(), $Cons($(), $Cons($(), $Nil()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))
);
推荐阅读
- c# - 从 MasterPage Master 获取文本框值
- javascript - 如何使用javascript从url获取数据
- android - camera2中的图像旋转问题
- javascript - 使用 Vue-chart.js 的水平图表标签
- javascript - 文本框需要弹出
- c# - Cancel Edit Cell on Double Click DataGridView C# WinForm
- jquery - 是否需要在 Angular 语义项目中包含 JQuery
- database - oracle中有哪些嵌套表
- javascript - Divi 滑块模块未显示 youtube 视频
- angularjs - 如何使用AngularJS将字符附加到输入字段中的数字?