Scala 地图集合案例-class 到 Map()

Scala map collection case-class to Map()

我有 2 个案例-classes:

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

case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int)

或分别 Seq[OutlierPortal]

我想要执行的操作与 Scala Macros: Making a Map out of fields of a class in Scala 类似,但我想将(嵌套的)case-classes 的序列映射到 Seq[Map[String, Any]].

然而,对于 scala 的新手我有点害怕 macros 的提议想法。有没有一种 "simpler" 方法可以将这个 Seq[OutlierPortal] 的序列映射到 Seq[Map[String, Any]]

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

如果您希望避免花哨的技巧,并且您没有太多 类 来写这个,您可以自己编写创建地图的方法。我建议在您的案例 类 中添加名为 toMap 的方法。如果使用 Map() 构造函数,OutlierPortalTimeSeriesData 很简单:

case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int) {
  def toMap: Map[String, Any] = Map(
    "period" -> period,
    "totalAmount" -> totalAmount,
    "isOutlier" -> isOutlier)
}

我想那里有一些重复,但至少如果您有理由更改字符串值而不是变量名称,您可以灵活地这样做。

要获取一系列可以调用 toMap 的内容,并将其转换为 Seq[Map[String, Any]],只需使用 map:

mySeq.map { _.toMap }

我们可以用这两个来写OutlierPortaltoMap:

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](或它们的序列等)的值,该方法不关心它是哪种特定类型。