2016-05-16 17 views
0

私は2ケースのクラスがあります:私は実行したい何(マップするためにScalaのマップコレクションケースクラス)

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]]にマッピングしたいと考えています。

しかし、スカラーの新しさは私が少し考えているマクロの考えを少し恐れる。このシーケンスをSeq[OutlierPortal]のシーケンスにマップする簡単な方法はありますかSeq[Map[String, Any]]

また、初心者がスカラでもマクロを使用することをお勧めしますか?私にとっては、一方向の変換(case-class - > map)で十分です。

+0

明確にするには、文字列をハードコーディングしないようにしていますか? –

+0

柔軟なキーはいいですが、必須ではありません –

+0

フィールド値を含むAny型の 'value'が必要ですか? –

答えて

4

あなたは奇妙なことを避けたいと思っていますが、これを書くためのクラスがあまり多くない場合は、自分でマップを作成するメソッドを書くことができます。あなたのケースクラスにtoMapのような名前のメソッドを追加することをお勧めします。私はそこにいくつかの重複がありますが、あなたが今までの文字列値を変更する理由はなく、変数名を持っている少なくともあれば、あなたは柔軟性があるとし

case class OutlierPortalTimeSeriesData(period: Timestamp, totalAmount: Double, isOutlier: Int) { 
    def toMap: Map[String, Any] = Map(
    "period" -> period, 
    "totalAmount" -> totalAmount, 
    "isOutlier" -> isOutlier) 
} 

:あなたはMap()コンストラクタを使用する場合OutlierPortalTimeSeriesDataのは簡単ですそれをする。あなたが上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](またはそのシーケンスなど)に変換できることがわかっている値。

+0

このソリューションを実装すると、次のエラーが発生します:def mapOutliersForJobserver(Outliers:Future [Seq [OutlierPortal]):Future [Seq [Map [String、Any]] = { outliers.map(_.toMap) } 'error:' Future [Map [Nothing、Nothing]]がFuture [Seq [Map [String、Any]]の型に適合しませんここで何が問題なのですか?それはSeq [T]ですか? –

+0

@geoHeilあなたは 'Seq [T] 'と同じ' Future [Seq [T]]を扱おうとしています。しかし、Seq [Seq [T]]と同じように、それらは異なっています。 –

+0

@geoHeilだから、たとえば、{outliers.map {_.map {_.toMap}}のように 'map'に2つのネストされた呼び出しを使うことができます。それを行うには、よりクリーンな方法がなければならない。 –

関連する問題