Wenn Sie versuchen, ausgefallene Tricks zu vermeiden, und Sie nicht zu viele Gesamtklassen haben, um dies zu schreiben, können Sie einfach die Methoden zum Erstellen der Karten selbst schreiben. Ich würde vorschlagen, Methoden wie etwa toMap
zu Ihren Fallklassen hinzuzufügen. OutlierPortalTimeSeriesData
‚s ist einfach, wenn Sie die Map()
Konstruktor verwenden:
case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int) {
def toMap: Map[String, Any] = Map(
"period" -> period,
"totalAmount" -> totalAmount,
"isOutlier" -> isOutlier)
}
Ich nehme an, es gibt einige Überschneidungen gibt, aber zumindest, wenn Sie jemals einen Grund haben die String-Werte zu ändern, aber nicht die Variablennamen haben Sie die Flexibilität das zu tun.
Um eine Folge von etwas nehmen Sie toMap
auf, und schalten Sie ihn in eine Seq[Map[String, Any]]
einfach anrufen können, verwenden map
:
case class OutlierPortal(portal: String, timeData: Seq[OutlierPortalTimeSeriesData]) {
def toMap: Map[String, Any] = Map(
"portal" -> portal,
"timeData" -> timeData.map { _.toMap })
}
:
mySeq.map { _.toMap }
Wir diese können sowohl OutlierPortal
‚s toMap
zu schreiben
und dann wieder um eine Seq[OutlierPortal]
in eine Seq[Map[String, Any]]
zu konvertieren.
Je nachdem, wie Sie diese Objekte und Methoden verwenden, Sie könnten ein Merkmal definieren wollen, die Klassen mit dieser Methode unterscheidet, und haben Ihren Fall Klassen erweitern es:
trait HasToMap { def toMap: Map[String, Any] }
case class Blah(/* ... */) extends HasToMap {
def toMap: /* ... */ }
}
Dies würde Sie nehmen ein Wert, von dem Sie wissen, dass Sie ihn in Map[String, Any]
(oder eine Folge von ihnen usw.) in einer Methode umwandeln können, die sich ansonsten nicht darum kümmert, um welchen bestimmten Typ es sich handelt.
Um klar zu sein, du willst vermeiden, die Strings hart zu codieren? –
Flexible Schlüssel wären nett, aber nicht zwingend notwendig –
Sie wollen den 'Wert' des Typs' Any' mit den Feldern value? –