[英]Scala map collection case-class to Map()
我有2個案例類:
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData])
和
case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int)
或分別為Seq[OutlierPortal]
我要執行的操作類似於Scala宏:使用Scala中的類的字段制作映射 ,但是我想將(嵌套的)案例類的Seq[Map[String, Any]]
到Seq[Map[String, Any]]
。
但是,對於scala的新手,我有點擔心擬議的宏概念。 有沒有一種“更簡單”的方法來將此Seq[OutlierPortal]
Seq[Map[String, Any]]
到Seq[Map[String, Any]]
還是即使Scala的初學者也建議您開始使用宏? 對我來說,單向轉換(案例類->地圖)就足夠了。
如果您想避免花哨的技巧,並且沒有太多的總類可以編寫,那么您可以自己編寫用於創建地圖的方法。 我建議將命名為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 }
我們都可以使用這兩者來編寫OutlierPortal
的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]
(或它們的序列等)的值,否則該方法將不在乎它是哪種特定類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.