gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:19:09 26 4
gpt4 key购买 nike

假设我有这门课

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在它的实例上。

关于scala - 在scala中,如何将对象的值转换为Map[String, String]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12797300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com