Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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_Scala Macros_Case Class_Seq - Fatal编程技术网

Scala映射集合案例类到映射()

Scala映射集合案例类到映射(),scala,scala-macros,case-class,seq,Scala,Scala Macros,Case Class,Seq,我有两个案例课程: case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData]) 及 或分别为Seq[OutlierPortal] 我想执行的操作与类似,但我想将一系列(嵌套的)案例类映射到Seq[map[String,Any]] 然而,对于scala来说,我有点担心提出的宏的想法。是否有一种“更简单”的方法将这一序列的Seq[OutlierPortal]映射到Seq[map[Strin

我有两个案例课程:

case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData])

或分别为
Seq[OutlierPortal]

我想执行的操作与类似,但我想将一系列(嵌套的)案例类映射到
Seq[map[String,Any]]

然而,对于scala来说,我有点担心提出的宏的想法。是否有一种“更简单”的方法将这一序列的
Seq[OutlierPortal]
映射到
Seq[map[String,Any]]


或者,即使是scala的初学者,您是否建议开始使用宏?对我来说,一个单向转换(case class->map)就足够了。

如果你想避免花哨的把戏,并且你没有太多的类来编写它,你可以自己编写创建映射的方法。我建议将名为
toMap
的方法添加到您的案例类中<如果使用
Map()
构造函数,则代码>异常值PortalTimesData很简单:

case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int) {
  def toMap: Map[String, Any] = Map(
    "period" -> period,
    "totalAmount" -> totalAmount,
    "isOutlier" -> isOutlier)
}
我想这里有一些重复,但至少如果您有理由更改字符串值而不是变量名,那么您可以灵活地进行更改

要获取可以调用
toMap
on的某个序列,并将其转换为
Seq[Map[String,Any]]
,只需使用
Map

mySeq.map { _.toMap }
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData]) {
  def toMap: Map[String, Any] = Map(
    "portal" -> portal,
    "timeData" -> timeData.map { _.toMap })
}
我们可以使用这两种方法来编写
门户
toMap

mySeq.map { _.toMap }
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData]) {
  def toMap: Map[String, Any] = Map(
    "portal" -> portal,
    "timeData" -> timeData.map { _.toMap })
}
然后再次将
Seq[OutlierPortal]
转换为
Seq[Map[String,Any]]

根据您使用这些对象和方法的方式,您可能希望定义一个特性,用此方法区分类,并让您的案例类扩展它:

trait HasToMap { def toMap: Map[String, Any] }
case class Blah( /* ... */ ) extends HasToMap {
  def toMap: /* ... */ }
}

这将允许您获取一个可以转换为
Map[String,Any]
(或它们的一个序列,等等)的值,该方法不关心它是哪种特定类型。

如果您希望避免花哨的把戏,并且您没有太多的总类来编写它,您可以自己编写创建贴图的方法。我建议将名为
toMap
的方法添加到您的案例类中<如果使用
Map()
构造函数,则代码>异常值PortalTimesData
很简单:

case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int) {
  def toMap: Map[String, Any] = Map(
    "period" -> period,
    "totalAmount" -> totalAmount,
    "isOutlier" -> isOutlier)
}
我想这里有一些重复,但至少如果您有理由更改字符串值而不是变量名,那么您可以灵活地进行更改

要获取可以调用
toMap
on的某个序列,并将其转换为
Seq[Map[String,Any]]
,只需使用
Map

mySeq.map { _.toMap }
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData]) {
  def toMap: Map[String, Any] = Map(
    "portal" -> portal,
    "timeData" -> timeData.map { _.toMap })
}
我们可以使用这两种方法来编写
门户
toMap

mySeq.map { _.toMap }
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData]) {
  def toMap: Map[String, Any] = Map(
    "portal" -> portal,
    "timeData" -> timeData.map { _.toMap })
}
然后再次将
Seq[OutlierPortal]
转换为
Seq[Map[String,Any]]

根据您使用这些对象和方法的方式,您可能希望定义一个特性,用此方法区分类,并让您的案例类扩展它:

trait HasToMap { def toMap: Map[String, Any] }
case class Blah( /* ... */ ) extends HasToMap {
  def toMap: /* ... */ }
}

这将允许您获取一个可以转换为
Map[String,Any]
(或它们的一个序列,等等)的值,该方法不关心它是哪种特定类型。

要清楚,您希望避免对字符串进行硬编码?灵活的键很好,但不是必需的。您希望类型为
Any
包含字段值?另外,您看到这个问题的答案了吗?可能是您的副本:@danGetz此方法优于宏吗?宏与这种简捷的解决方案相比有什么优势?很明显,您希望避免对字符串进行硬编码?灵活的键很好,但不是强制键。您希望类型为
Any
值包含字段值?另外,您看到这个问题的答案了吗?可能是您的副本:@danGetz此方法优于宏吗?宏与这个简单的解决方案相比有什么优势?现在实现这个解决方案时,我会遇到以下错误:
def-mapoursforjobserver(离群值:Future[Seq[OutlierPortal]]):Future[Seq[Map[String,Any]]={outliers.Map(u.toMap)}
error:
Future[Map[Nothing,Nothing]]与Future[Seq]类型不符[Map[String,Any]]]
这里的问题是什么?是Seq[T]吗?@geoHeil您试图将
未来[Seq[T]
视为与
Seq[T]
相同。不过,它们是不同的,就像
Seq[T]
一样。@geoHeil因此,例如,您可以使用两个嵌套调用
Map
{outliers.Map{/code>一样{{code.toMap}}
但是必须有一个更干净的方法来做。现在实现这个解决方案,我得到了以下错误:
def-mapoursforjobserver(离群值:Future[Seq[OutlierPortal]]]:Future[Seq[Map[String,Any]]={outliers.Map({.toMap)}
错误:
Future[Map[Nothing,Nothing]]与Future类型不符[Seq[Map[String,Any]]]
这里的问题是什么?是Seq[T]吗?@geoHeil您试图将
未来的[Seq[T]]
视为与
Seq[T]
相同。不过,它们是不同的,就像
Seq[Seq[T]
一样。@geoHeil因此,例如,您可以使用两个嵌套调用来
Map
{s.outlierMap一样{{uu.map{{uu.toMap}
。但是必须有一种更干净的方法来做这件事。