假设我有一个懒惰成员的案例类
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/