scala - 要在 Scala 中映射的案例类

标签 scala case-class

有没有一种好的方法可以转换 Scala case class 实例,例如

case class MyClass(param1: String, param2: String)
val x = MyClass("hello", "world")

某种映射,例如

getCCParams(x) returns "param1" -> "hello", "param2" -> "world"

它适用于任何案例类,而不仅仅是预定义的案例类。我发现您可以通过编写询问底层 Product 类的方法来提取案例类名称,例如

def getCCName(caseobj: Product) = caseobj.productPrefix 
getCCName(x) returns "MyClass"

所以我正在寻找类似的解决方案,但针对的是案例类字段。我想象一个解决方案可能必须使用 Java 反射,但我不想编写一些如果案例类的底层实现发生变化的话可能会在 Scala 的 future 版本中中断的东西。

目前,我正在开发 Scala 服务器,并使用案例类定义协议(protocol)及其所有消息和异常,因为它们是一个如此美丽、简洁的构造。但随后我需要将它们转换为 Java 映射,以便通过消息传递层发送以供任何客户端实现使用。我当前的实现只是分别为每个案例类定义一个翻译,但最好找到一个通用的解决方案。

最佳答案

这应该有效:

def getCCParams(cc: AnyRef) =
  cc.getClass.getDeclaredFields.foldLeft(Map.empty[String, Any]) { (a, f) =>
    f.setAccessible(true)
    a + (f.getName -> f.get(cc))
  }

关于scala - 要在 Scala 中映射的案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1226555/

相关文章:

scala - 具有不同 bin 大小的 JFreeChart 直方图

scala - Spark : Replace Null value in a Nested column

string - 如何在scala中比较两个字符串?

scala - 有效地序列化案例类

scala - Scala 中案例类的 hashCode

scala - 一般重写 Scala 案例类

scala - 更改默认的Scala平台netbeans?

scala - 在 play.api.test 中找不到 Play Framework 2.4 WithApplication 调用

class - Scala:从子类引用伴随对象

scala - 仅在满足条件时覆盖默认参数