scala - 按名称激活惰性变量

标签 scala reflection lazy-evaluation

假设我有一个带有惰性成员的案例类

case class Person(name: String, surname: String) {
  lazy val initials: String = name(0) + "." + surname(0) + "."
}

我有一个将它转换成 Map 的通用函数

def getCCParams(cc: AnyRef) =
  cc.getClass.getDeclaredFields.map { f =>
    f.setAccessible(true)
    f.getName -> f.get(cc)
  }.toMap

现在我创建一个人并获得它的值

val JohnSmith = Person("John", "Smith")
val res = getCCParams(JohnSmith)
println(res)

这样我就得到了结果

HashMap(initials -> null, name -> John, surname -> Smith)

initials 等于 null 因为它没有被调用。 有没有办法在 getCCParams 函数中激活惰性值?我可以作为参数传递的惰性成员列表

def getCCParams(cc: AnyRef, lazyMembers: List[String] = List("initials")) = ...

谢谢

最佳答案

惰性值在第一次调用访问器方法时被初始化。那么也许您可以直接调用这些方法而不是尝试直接访问字段?

def getCCParams(cc: AnyRef) = {
  val clazz = cc.getClass
  clazz.getDeclaredFields.flatMap { f =>
    Try(clazz.getMethod(f.getName)) //get the accessor method by name of field
      .toOption
      .map(m => f.getName -> m.invoke(cc))
  }.toMap
}

结果: map (姓名首字母 -> J.S.,姓名 -> 约翰,姓氏 -> 史密斯)

关于scala - 按名称激活惰性变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59554229/

相关文章:

scala - 如何在scala中获取数组的最后一个元素

c# - 将属性作为参数的通用函数

scala - 初始化顺序在延迟 val 访问时抛出空指针

recursion - 递归函数导致堆栈溢出

scala - 如何在scala/play中将casbah mongodb列表转换为json

scala - Scala中如何匹配枚举?

scala - 将 Scala 反射与 Java 反射结合使用

c# - GetMember 是否应该返回封闭类型的抽象属性?

java - 多维长度数组反射java

ruby - Ruby 中有类似 Python 生成器的东西吗?