Kotlin 检查数据类属性是否全部为 null

And*_*nik 2 reflection kotlin

假设我有一个具有可为空属性的数据类:

data class User(
   val fName: String?,
   val lName: String?)
Run Code Online (Sandbox Code Playgroud)

在一个函数中,即使该实例不为空,我也会收到此类的实例,我想检查内部的至少一个属性是否已初始化且不为空。我知道我可以一一检查属性,但我想要一些更通用的东西,我用谷歌搜索了一下,似乎 Kotlin 没有这方面的扩展功能,所以我实现了一个,想与您分享并检查是否有人知道更好方法。

And*_*nik 6

因此,这可以使用 Kotlin 反射来完成,下面是一个扩展函数来执行此操作:

fun Any.isAllNullInside(): Boolean {
     if(this::class.declaredMemberProperties.any { !it.returnType.isMarkedNullable }) return false
     return this::class.declaredMemberProperties.none { it.getter.call(this) != null }
}
Run Code Online (Sandbox Code Playgroud)

@gidds 谢谢你的好收获。我知道它的性能会更差,但是任何基于反射的解决方案都会比手动完成的解决方案性能更差。但是,如果可以损失一些小的性能但有通用的解决方案,我想反射是非常强大的机制。

与不可空属性和 Lateinit 变量相关,我添加了一行代码来修复这两个问题。感谢您的捕获!

  • 请注意,像这样使用反射的性能可能比显式检查差得多。(它还检查不可为空的属性——毫无意义。并且您应该确认它适用于“lateinit”属性,并且不会抛出异常而不是返回“false”。) (3认同)