有没有一种很好的方法可以转换Scala case class实例,例如
case class MyClass(param1: String, param2: String)
val x = MyClass("hello", "world")
Run Code Online (Sandbox Code Playgroud)
进入某种映射,例如
getCCParams(x) returns "param1" -> "hello", "param2" -> "world"
Run Code Online (Sandbox Code Playgroud)
适用于任何案例类,而不仅仅是预定义的类.我发现你可以通过编写一个询问底层Product类的方法来拉出case类名,例如
def getCCName(caseobj: Product) = caseobj.productPrefix
getCCName(x) returns "MyClass"
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找类似的解决方案,但对于案例类字段.我想象一个解决方案可能不得不使用Java反射,但是如果案例类的底层实现发生变化,我讨厌在未来的Scala版本中编写一些内容.
目前我正在使用Scala服务器并使用案例类定义协议及其所有消息和异常,因为它们是如此美观,简洁的构造.但是,我需要将它们转换为Java映射,以通过消息传递层发送以供任何客户端实现使用.我当前的实现只是分别为每个案例类定义一个翻译,但是找到一个通用的解决方案会很好.
我正在寻找的是这个功能:
def maybe[A, B](a: Option[A])(f: A => B)(g: () => B): B = a match
{
case Some(x) => f(x)
case None => g()
}
Run Code Online (Sandbox Code Playgroud)
这是在Haskell的前奏中所以我认为它可能在某个地方的Scala标准库中,我只是错过了它.我讨厌不得不在项目中重新编码,所以我想知道是否有人知道它在哪里,或者它是否肯定不存在.或者有更好的方法来获得此功能?