所以,问题在于标题,但这里有详细信息。
我有两个案例类:
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
)
哪个有效,但非常难看,需要大量维护。
我尝试做的一件事是:
shapeless
并从结果元组构建目标对象
导入shapeless._ import syntax.std.tuple ._
val groupApi =(JourneyGroup.unapply(group).get:+ Seq.empty [Party])(JourneyGroupApi.tupled)
但是,这件事声称,:+
的结果不是元组,即使在控制台中:
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,无,无,无,无,列表())
我做错了什么?也许还有另一种方法可以达到这个目的。
答案 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中进一步讨论。