簡體   English   中英

Scala地圖收集案例類到Map()

[英]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 }

我們都可以使用這兩者來編寫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] (或它們的序列等)的值,否則該方法將不在乎它是哪種特定類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM