如何将Scala样例类属性与变量序列映射生成指定格式字符串?
Scala 实现样例类属性映射为指定格式字符串
首先修正你的样例类语法错误:Scala 里样例类的参数要放在括号中,且基础类型首字母大写(比如Int而非int),正确定义如下:
case class VariablesToMap( id: Int, // 示例值: 100 name: String, // 示例值: Jon country: String, // 示例值: USA pincode: String, // 示例值: 121212 state: String, // 示例值: Texas ssn: String // 示例值: ABCGS125AJH )
以下是三种可行的实现方案:
方案一:手动匹配(类型安全,适合简单场景)
如果属性数量不多,直接通过模式匹配获取对应值,避免反射开销:
val instance = VariablesToMap(100, "Jon", "USA", "121212", "Texas", "ABCGS125AJH") val myColumns = Seq("id", "name", "country") val op = myColumns.map { case "id" => s"/id=${instance.id}" case "name" => s"/name=${instance.name}" case "country" => s"/country=${instance.country}" // 可按需添加其他属性的匹配分支 }.mkString + "/" // 最终结果:/id=100/name=Jon/country=USA/
方案二:反射实现(灵活适配动态列)
通过 Scala 反射 API 动态获取属性值,适合列名动态变化的场景:
import scala.reflect.runtime.universe._ val instance = VariablesToMap(100, "Jon", "USA", "121212", "Texas", "ABCGS125AJH") val myColumns = Seq("id", "name", "country") val mirror = runtimeMirror(instance.getClass.getClassLoader) val instanceMirror = mirror.reflect(instance) val op = myColumns.map { column => val fieldSymbol = typeOf[VariablesToMap].decl(TermName(column)).asTerm val fieldMirror = instanceMirror.reflectField(fieldSymbol) s"/$column=${fieldMirror.get}" }.mkString + "/" // 最终结果:/id=100/name=Jon/country=USA/
方案三:利用样例类的 Product 特性(简洁高效)
Scala 样例类默认实现Product特质,可快速构建属性名与值的映射:
import scala.reflect.runtime.universe._ val instance = VariablesToMap(100, "Jon", "USA", "121212", "Texas", "ABCGS125AJH") val myColumns = Seq("id", "name", "country") // 获取样例类的所有属性名 val fieldNames = typeOf[VariablesToMap].members.sorted.collect { case m: MethodSymbol if m.isCaseAccessor => m.name.toString } // 构建属性名到值的映射表 val fieldMap = fieldNames.zip(instance.productIterator.toSeq).toMap val op = myColumns.map(column => s"/$column=${fieldMap(column)}").mkString + "/" // 最终结果:/id=100/name=Jon/country=USA/
内容的提问来源于stack exchange,提问作者morgan
相关产品推荐
相关产品推荐

