【问题标题】:Access all case class values without reflection无需反射即可访问所有案例类值
【发布时间】:2020-07-27 11:38:32
【问题描述】:

我有一个案例类,我有一个场景,我想在字符串中获取案例类的所有字段值,用 - 分隔,如果案例类的值不存在,在这种情况下使用空字符串。我能够这样做但是使用反射,有没有其他方法可以不使用反射?

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 应该是结果

【问题讨论】:

  • 如果覆盖 toString 方法会怎样?
  • 所有案例类都隐式实现了 ProductN 特征。您可以使用 productIterator 获取所有字段的 Iterator。或者,您可以覆盖更传统的 toString 方法。

标签: scala scala-collections


【解决方案1】:

您可以使用所有案例类拥有的productIterator method,后跟mkString

test.productIterator.map(v => Option(v).fold(ifEmpty = "")(_.toString)).mkString("-")

(顺便说一句,这不好闻,nullcase 类 上的可能性是一种不好的做法,这感觉像是一种非常朴素的数据编码方式).

【讨论】:

  • 在速度方面,使用反射会更好吗?
  • @ScalaEnthusiastic reflection 总是比任何其他替代方案更慢、更不安全和更不安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2020-07-10
  • 2022-01-03
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多