scala - 使用可选列表压缩列表以在 Scala 中构造对象列表
问题描述
我有一个这样的案例类:
case class Metric(name: String, value: Double, timeStamp: Int)
我收到单独的组件以在单独的列表中构建指标并将它们压缩以创建指标对象列表。
def buildMetric(names: Seq[String], values: Seq[Double], ts: Seq[Int]): Seq[Metric] = {
(names, values, ts).zipped.toList map {
case (name, value, time) => Metric(name, value, time)
}
}
现在我需要为 buildMetric 函数和 Metric 类添加一个可选参数。
case class Metric(name: String, value: Double, timeStamp: Int, type: Option[Type])
&
def buildMetric(names: Seq[String], values: Seq[Double], ts: Seq[Int], types: Option[Seq[Type]]): Seq[Metric]
这个想法是我们有时会收到一个类型的序列,如果存在的话,它与名称和值列表的长度相匹配。我不确定如何修改 buildMetric 函数的主体以惯用地创建具有类型信息的 Metric 对象。我可以想到几种方法。
执行 if-else on
types.isDefined
,然后types.get
在一种情况下使用另一个列表压缩类型,并在另一种情况下如上所示。这使我两次编写相同的代码。另一种选择是简单地使用 while 循环并创建一个
types.map(_(i))
传递最后一个参数的 Metric 对象。
到目前为止,我使用的是第二个选项,但我想知道是否有更实用的方法来处理这个问题。
解决方案
第一个选项无法完成,因为zipped
仅适用于 3 个或更少元素的元组。第二个版本可能如下所示:
def buildMetric(names: Seq[String], values: Seq[Double], ts: Seq[Int], types: Option[Seq[Type]]): Seq[Metric] =
for {
(name, i) <- names.zipWithIndex
value <- values.lift(i)
time <- ts.lift(i)
optType = types.flatMap(_.lift(i))
} yield {
Metric(name, value, time, optType)
}
推荐阅读
- reactjs - 如何使用 onClick 获取要为组件加载的路由路径?
- linux - 与 SIGTERM 一起传递其他信息
- html - 如何使用 Flexbox 进行网格布局
- java - 我如何一次有效地更新一个类的数千个实例?
- c# - 自动售货机中的 3 层架构,同时保持 OCP
- java - 有没有办法使用 itext 库清理扫描的 pdf 的矩形区域?
- javascript - 使用 typescript 框架时,所有源代码都在 node_modules 中编译
- javascript - aws 部署 nodejs express 后端提供的 HTML 文件但无法加载反应 js 文件
- git - 创建没有(以前的)本地历史记录的远程分支
- powershell - 在非主节点上运行 pipline jenkins 阶段期间,“powershell.exe”未被识别为内部或外部命令