scala在case类之间转换的最佳方法是什么?

时间:2017-04-01 00:57:52

标签: scala

我有一个模型类,我从我的服务器中的api回来,当我将它返回给某个客户端时,我想使用我自己的模型来保持客户端更简单和更清洁。

示例:

case class ReturnedModel(succeed: Option[String], reason: Reason, transactionId: List[Int], opId: Option[Int])

case class MyReturnedModel(reason: String)

我可能需要在将来做更多这样的事情,所以我想也许有一个我不知道的最好的做法,谢谢!

3 个答案:

答案 0 :(得分:1)

您可以将伴随对象与自定义" apply"方法:

case class MyReturnedModel(reason: String)

object MyReturnedModel {
  def apply(mod: ReturnedModel) = MyReturnedModel(mod.reason.toString)
}

val data: ReturnedModel = ... // Some instance of ReturnedModel
val mr = MyReturnModel(data)

请注意,case类及其随播对象需要位于同一个文件中才能生效。

答案 1 :(得分:0)

取决于您的使用案例:

sealed trait IKnowAReason { def reason:String }

case class ReturnedModel(succeed: Option[String], reason: Reason,
  transactionId: List[Int], opId: Option[Int]) extends IKnowAReason

现在将MyReturnedModel的使用替换为IKnowAReason。注意密封,它将确保在同一源文件之外没有IKnowAReason的其他实现。

答案 2 :(得分:0)

如果您有权更改ReturnedModel,则可以使用@pedrofurla所展示的特征。

如果您无法修改ReturnedModel,您可以声明一个隐式函数,将ReturnedModel的所有实例转换为MyReturnedModel,如下所示:

implicit def returnedModelToMyModel(returnedModel: ReturnedModel): MyReturnedModel = {

  // Have some logic to convert their model to your model
  MyReturnedModel(returnedModel.reason.toString)

}

然后,无论何时从API获得ReturnedModel,您都可以在任何预期MyReturnedModel实例的地方使用它:

def doWork(myReturnedModel: MyReturnedModel) = { /* Logic that needs and instance of MyReturnedModel */ }

// Grab an instance of ReturnModel from the API
val returned: ReturnedModel = ???

// Will get converted when you need it to be an instance of MyReturnedModel
doWork(returned)

当编译器发现您传递的类型不正确时,它将尝试预先形成隐式转换,此时它将寻找隐式转换以满足类型转换。