在scala中,如何将对象的值转换为Map[String, String]?

2024-05-06

假设我有这门课

case class Test (id: Long, name: String)

和这个类的一个实例:

Test :
id -> 1
name -> toto

我想创建一个 Map[String, String] 如下:

Map( "id" -> "1", "name" -> "toto")

我的问题是:有没有办法将 Test 的这个实例转换为 Map[String, String] ?我想避免使用这样的方法:

def createMap(instance: Test): Map[String, String] = {
    val map = new Map[String, String]
    map.put("id", instance.id.toString)
    map.put("name", instance.name)
    map
}

如果 Scala 中没有方法可以做到这一点,有没有办法迭代类属性?也许我可以创建一个通用函数来执行此操作:

def createMap(instance: T): Map[String, String] = {
   val map = new Map[String, String]
   //pseudocode 
   for  ((name, value) <- instance.getClassProperties.getValues) {
      case value.isInstanceOf[String] : map.push(name, value)
      case _ : map.push(name, value.toString)
    }
    map
}

那可能吗 ?如果您有很好的示例/链接,我很感兴趣。


是的,这是可能的。从 Scala 2.10 开始,您可以使用反射。

假设您有:

val test = Test(23423, "sdlkfjlsdk")

以下内容将为您带来您想要的:

import reflect.runtime.universe._
import reflect.runtime.currentMirror

val r = currentMirror.reflect(test)
r.symbol.typeSignature.members.toStream
  .collect{case s : TermSymbol if !s.isMethod => r.reflectField(s)}
  .map(r => r.symbol.name.toString.trim -> r.get.toString)
  .toMap

要简单地迭代案例类的字段值,请使用.productIterator在其实例上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在scala中,如何将对象的值转换为Map[String, String]? 的相关文章

随机推荐