使用可选列表压缩列表以在Scala中构造对象列表
我有这样一个案例类:使用可选列表压缩列表以在Scala中构造对象列表,scala,functional-programming,Scala,Functional Programming,我有这样一个案例类: case class Metric(name: String, value: Double, timeStamp: Int) def buildMetric(names: Seq[String], values: Seq[Double], ts: Seq[Int], types: Option[Seq[Type]]): Seq[Metric] = for { (name, i) <- names.zipWithIndex value <-
case class Metric(name: String, value: Double, timeStamp: Int)
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)
}
我接收单独的组件以在单独的列表中构建度量,并压缩它们以创建度量对象列表
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])
&
其思想是,我们有时会收到一个类型的序列,如果存在,则该序列与名称和值列表的长度相匹配。我不知道如何修改buildMetric函数体,以习惯性地创建具有类型信息的度量对象。我可以想出几种方法
在types.isDefined上执行if-else,然后使用types.get压缩类型,在一个条件下使用另一个列表,在另一个条件下保留如上所述。这让我写了两次相同的代码
另一个选项是简单地使用while循环并创建一个带有types.map_的度量对象,我传递了最后一个参数
到目前为止,我正在使用第二种选择,但我想知道是否有一种更实用的方法来处理这个问题 在我看来,如果您想保持这种压缩方法,还有一个选项-将类型从选项[Seq[Type]]转换为与名称长度相同的Seq[option[Type]],如果类型也是None,则使用None值填充: val optionTypes:Seq[Option[Type]=types.foldSeq.fillnames.lengthNone:Option[Type]\uuux.mapSome_ //抱歉,未找到Tuple4案例的“zipped” names.zipValue.zipts.zipoptionTypes.toList.map{ 案例名称、值、时间、optionType=>Metricname、值、时间、optionType }
希望这有帮助 在我看来,如果您想保持这种压缩方法,还有一个选项-将类型从选项[Seq[Type]]转换为与名称长度相同的Seq[option[Type]],如果类型也是None,则使用None值填充: val optionTypes:Seq[Option[Type]=types.foldSeq.fillnames.lengthNone:Option[Type]\uuux.mapSome_ //抱歉,未找到Tuple4案例的“zipped” names.zipValue.zipts.zipoptionTypes.toList.map{ 案例名称、值、时间、optionType=>Metricname、值、时间、optionType }
希望这有帮助 第一个选项无法完成,因为zipped仅适用于3个或更少元素的元组。 第二个版本可能如下所示:
case class Metric(name: String, value: Double, timeStamp: Int)
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)
}
第一个选项无法完成,因为zipped仅适用于3个或更少元素的元组。 第二个版本可能如下所示:
case class Metric(name: String, value: Double, timeStamp: Int)
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)
}
您可以在类型上使用模式匹配:
您可以在类型上使用模式匹配:
谢谢,我试过了。这是一个很好的方法,但我惊讶地看到Seq.fill操作似乎非常占用cpu。测试时,我的集群中的cpu利用率从4-5%上升到50-70%!谢谢,我试过了。这是一个很好的方法,但我惊讶地看到Seq.fill操作似乎非常占用cpu。测试时,我的集群中的cpu利用率从4-5%上升到50-70%!