scala - 让一种方法接受两种不同模型的 Scala 最佳实践是什么

标签 scala json4s

目前我有一个接受 ModelA 并知道对其执行操作的方法。

所以在我的 Controller 中我接受了 ModelA 的请求并用它调用这个方法。

现在,我希望能够接受 ModelB 的请求,将请求映射到 ModelA(因为它具有相同的数据,但不是全部并使用不同的名称),并用它调用此方法。

假设该方法看起来像:

def myMethod(data: ModelA): ResModel = {
    // do something with data
}

我的 Controller 目前是:

def doActions(): Action[JValue] = { request => 
    val dataExctracted = request.body.extract[ModelA]
    myMethod(dataExctracted)
    ...
}

我的两个模型都只是单独文件中的案例类:

case class ModelA(a: String, b: String, c: String)

case class ModelB(aAsDifferentName: String, bAsDifferntName: String)

让 myMethod 接受两个模型(没有 Either)的 Scala 最佳实践是什么? Controller 应该如何应对?

是否还有一种经典的方法可以返回不同的模型而不必接受不同 Controller 方法中的调用?

谢谢!

最佳答案

您可以尝试对联合类型建模(如 Dotty 中的 Int | String)。

像这样:

scala> case class Or[A, B](a: A, b: B)
defined class Or

scala> def test(v: Int Or String): String = {
     | v.toString
     | }
test: (v: Or[Int,String])String

scala> implicit def Int2Or(x: Int): Int Or String = Or(x, "")
Int2Or: (x: Int)Or[Int,String]

scala> implicit def String2Or(x: String): Int Or String = Or(-1, x)
String2Or: (x: String)Or[Int,String]

scala> test(1)
res0: String = Or(1,)

scala> test("")
res1: String = Or(-1,)

很酷的是,你可以像这样使用OrString Or Boolean,但这绝对不是真正的联合类型来自多蒂。

在我看来,直截了当的解决方案是使用密封特征并进行模式匹配。

关于scala - 让一种方法接受两种不同模型的 Scala 最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46840013/

相关文章:

java - 尝试序列化从 scala 转换的 java 映射时出现不可序列化异常

json - 自定义 akka 持久化(播放!)JSON(反)序列化器

scala - 从返回类型推断泛型隐式参数的类型

scala - 更新 IntelliJ IDEA

scala - Json4s 忽略 @JsonProperty jackson 注释

scala - 使用 JUnit 4 进行 Gradle Scala 单元测试中的神秘 `classMethod` 测试

json - 检查对象在 json4s/lift-json 中是否有字段

json - 将键值字符串转换为 Scala Map 的方法

scala - 包含保留关键字的 JSON 反序列化

scala - 如何编写处理集合的 json4s CustomSerializer