我有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)就足够了。
答案 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>