Scala 无反射地访问所有case类值

Scala 无反射地访问所有case类值,scala,scala-collections,Scala,Scala Collections,我有一个case类,我有一个场景,我想得到case类的所有字段值,用-分隔,如果case类的值不存在,那么在这种情况下使用空字符串。我可以这样做,但使用反射,有没有其他方法可以不用反射 case class Test( a: String, b: Int ) val test = Test( a = "aValue", b = 1 )

我有一个case类,我有一个场景,我想得到case类的所有字段值,用-分隔,如果case类的值不存在,那么在这种情况下使用空字符串。我可以这样做,但使用反射,有没有其他方法可以不用反射

case class Test(
               a: String,
               b: Int
               )


val test = Test( a = "aValue",
                 b = 1
               ) 

val result = test.getClass.getDeclaredFields
                .map { field =>
                  field.setAccessible(true)
                  Option(field.get(test)).getOrElse("")
                }
                .mkString("-")

aValue-1应该是结果

您可以使用所有case类,后跟一个mkString

顺便说一句,这听起来不太好,case类上可能出现null是一种不好的做法,这感觉像是一种非常粗俗的数据编码方式。

您可以使用所有case类,后跟一个mkString


顺便说一句,这听起来不太好,case类上可能出现null是一种不好的做法,这感觉像是一种非常粗俗的数据编码方式。

如果重写toString方法会怎么样?所有case类都隐式实现ProductN trait。可以使用productIterator获取所有字段的迭代器。或者,您可以只重写更常规的toString方法。如果重写toString方法呢?所有case类隐式实现ProductN trait。可以使用productIterator获取所有字段的迭代器。或者,您可以覆盖更传统的toString方法。就速度而言,使用反射是否更好?@ScalaEntusic reflection总是比任何其他方法都更慢、更不安全、更不安全。就速度而言,使用反射会更好吗?@scalaenthusical反射总是比任何其他选择都更慢、更不安全、更不安全。
test.productIterator.map(v => Option(v).fold(ifEmpty = "")(_.toString)).mkString("-")