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

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)

首字母等于null,因为未调用它。
有什么办法可以激活getCCParams函数中的惰性值?我可以作为参数传递的惰性成员列表
def getCCParams(cc: AnyRef, lazyMembers: List[String] = List("initials")) = ...

谢谢

最佳答案

首次调用accessor方法时,将初始化惰性val。因此,也许您可​​以调用这些方法而不是尝试直接访问字段?

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(initials -> J.S., name -> John, surname -> Smith)

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

10-10 14:31