将一个case类转换为另一个与Scala中的附加参数类似的case类

时间:2016-11-12 11:57:42

标签: scala tuples slick

所以,问题在于标题,但这里有详细信息。

我有两个案例类:

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])

背景:拥有这两个独立类的原因是光滑不支持集合,我确实需要手动构建的相关对象的集合。最重要的是,我不能让它与单个班级一起工作。

我需要的是一种从一种转换为另一种的简单方法。 此时,为了解锁我自己,我创建了一个手动转换:

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. 将源对象转换为元组
  2. 使用shapeless
  3. 向该元组添加元素
  4. 并从结果元组构建目标对象

    导入shapeless._ import syntax.std.tuple ._

    val groupApi =(JourneyGroup.unapply(group).get:+ Seq.empty [Party])(JourneyGroupApi.tupled)

  5. 但是,这件事声称,:+的结果不是元组,即使在控制台中:

      

    Party.unapply(p).get:+ Seq.empty [Participant]

         

    res0 :( Option [Int],model.Parties.Type.Value,Int,Int,org.joda.time.DateTime,Int,Option [org.joda.time.DateTime],Option [Int],Option [org.joda.time.DateTime],Option [Int],Seq [model.Participant])=(无,客户,123,234,2016-11-12T03:55:24.006-08:00,987,无,无,无,无,列表())

    我做错了什么?也许还有另一种方法可以达到这个目的。

1 个答案:

答案 0 :(得分:1)

你能考虑一下这个吗?

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

转换journeyGroup就像JourneyGroupApi(journeyGroup,parties)一样,“转换”journeyGroupApi将是访问journeyGroupApi.journeyGroup的问题。你或许可以想出一些对这种情况更有效的名字。不确定这种方法是否适合您的其余代码。特别是在journeyGroupApi中引用journeyGroup属性将是一个额外的级别,例如journeyGroupApi.journeyGroup.accountId。 (这可以通过travelGroupApi上的“快捷方式”定义来缓解,例如lazy val accountId = journeyGroup.accountId。)

继承也可能是一种考虑JourneyGroup的基本案例类的方法,然后是一个普通的类(不是案例类),它将派对作为额外属性进行扩展。此选项将在此SO thread中进一步讨论。