2016-11-12 6 views
0

問題はタイトルにありますが、ここに詳細があります。Scalaの追加パラメータと似ている別のケースクラスに変換する

私は2つのケースのクラスがあります。

case class JourneyGroup(id: Option[Int] = None, 
         key: UUID, 
         name: String, 
         data: Option[JsValue], 
         accountId: Int, 
         createdAt: DateTime = DateTime.now, 
         createdById: Int, 
         updatedAt: Option[DateTime] = None, 
         updatedById: Option[Int] = None, 
         deletedAt: Option[DateTime] = None, 
         deletedById: Option[Int] = None) 

case class JourneyGroupApi(id: Option[Int] = None, 
          key: UUID, 
          name: String, 
          data: Option[JsValue], 
          accountId: Int, 
          createdAt: DateTime = DateTime.now, 
          createdById: Int, 
          updatedAt: Option[DateTime] = None, 
          updatedById: Option[Int] = None, 
          deletedAt: Option[DateTime] = None, 
          deletedById: Option[Int] = None, 
          parties: Seq[Party] = Seq.empty[Party]) 

背景:これら二つの別々のクラスを持つ理由は、滑らかな、コレクションをサポートしていないという事実である、と私はコレクションが必要です私が手動で構築する関連オブジェクトの結論として、私はそれを単一のクラスで動作させることはできませんでした。

私が必要とするのは、1つから別のものへの簡単な変換方法です。作業していて、非常に醜いとメンテナンスの多くを必要とされる

def toJourneyGroupApi(parties: Seq[Party]): JourneyGroupApi = JourneyGroupApi(
    id = id, 
    key = key, 
    name = name, 
    data = data, 
    accountId = accountId, 
    createdAt = createdAt, 
    createdById = createdById, 
    updatedAt = updatedAt, 
    updatedById = updatedById, 
    deletedAt = deletedAt, 
    deletedById = deletedById, 
    parties = parties 
) 

: この時点で、自分自身のブロックを解除するために、私は手動で変換を作成しました。

私がやってみました一つのことがある:

  1. shapeless
  2. を使用して、そのタプルに要素を追加し、タプル

    を結果から、対象物を構築するタプルするソースオブジェクトを変換します

    import shapeless._ import構文.std.tuple._

    ヴァルgroupApi =(JourneyGroup.unapply(グループ)に.get:+ Seq.empty [パーティー])(JourneyGroupApi.tupled)

しかし、このことはさらに、:+の結果はタプルではないことを、主張して​​いますしかしコンソールで:

Party.unapply(P)に.get:+ Seq.empty [参加]

RES0:(オプション[INT]、model.Parties.Type.Value、INT、INT、オプション[org.joda.time.DateTime]、オプション[org.joda.time.DateTime]、オプション[Int]、オプション[org.joda.time.DateTime]、オプション[Int]、Seq [model.Participant])= (なし、クライアント、123,234,2016-11-12T03: 55:24.006-08:00,987、なし、なし、なし、なし、リスト())

私は間違っていますか?たぶんこれを達成する別の方法があります。

答えて

1

構図を考えてもいいですか?

case class JourneyGroup(
    ... 
) 
case class JourneyGroupApi(
    journeyGroup: JourneyGroup=JourneyGroup(), 
    parties: Seq[Party] = Seq() 
) 

journeyGroupを変換するとちょうどJourneyGroupApi(journeyGroup,parties)ようなものになるだろうとjourneyGroupApiを「変換する」journeyGroupApi.journeyGroupへのアクセスの問題だろう。あなたはおそらく、このケースでうまくいった名前を考え出すことができました。このアプローチがコードの残りの部分に適合するかどうかは不明です。特に、journeyGroupApiのjourneyGroup属性の参照は1つの余分なレベルになります。 journeyGroupApi.journeyGroup.accountId。 (これは潜在的にjourneyGroupApiの "ショートカット"定義によって緩和される可能性がありますlazy val accountId = journeyGroup.accountIdのように。)

継承は、JourneyGroupの基本ケースクラスと、余分な属性としてパーティを拡張する通常のクラス(ケースクラスではない)を考慮するアプローチかもしれません。このオプションについては、SO threadで詳しく説明しています。

+0

これはオプションですが、言及したように、残りのコードには最適ではありません。ありがとう。 –

関連する問題