Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用可选列表压缩列表以在Scala中构造对象列表_Scala_Functional Programming - Fatal编程技术网

使用可选列表压缩列表以在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%!