gpt4 book ai didi

scala - 使用可选列表压缩列表以在 Scala 中构造对象列表

转载 作者:行者123 更新时间:2023-12-05 08:50:53 24 4
gpt4 key购买 nike

我有一个这样的案例类:

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 对象。我可以想到几种方法。

  1. types.isDefined 上执行 if-else,然后在一个条件下使用 types.get 压缩类型和另一个列表,并在其他。这让我写了两次相同的代码。

  2. 另一种选择是简单地使用 while 循环并创建一个 Metric 对象,其中 types.map(_(i)) 传递最后一个参数。

到目前为止,我使用的是第二个选项,但我想知道是否有更实用的方法来处理这个问题。

最佳答案

第一个选项无法完成,因为 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)
}

关于scala - 使用可选列表压缩列表以在 Scala 中构造对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61077201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com