Scala地图集合案例类到Map()

时间:2016-05-16 15:18:42

标签: scala scala-macros case-class seq

我有2个案例类:

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,但我想将一系列(嵌套)案例类映射到Seq[Map[String, Any]]

然而,scala的新手我担心的提议。是否有一种“更简单”的方式将此Seq[OutlierPortal]序列映射到Seq[Map[String, Any]]

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

1 个答案:

答案 0 :(得分:4)

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

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 }

我们可以用这两个来写OutlierPortal' s 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](或它们的序列等)的值,否则它不关心它是哪种特定类型。< / p>

相关问题