我有多个可以为空的变量,我需要检查它们(字符串和日期)。
我需要一个方法,在这个方法中,我向它传递X个变量,它会返回一个变量列表,这些变量都是空的。
我在想一个我可以这么叫的东西:
internal fun checkNullVariables ( var x, var y , ..... ) : MutableList<String>{
// yada yada
return listOfNamesOfNullVariables
}发布于 2019-10-01 21:39:27
这肯定需要反射,因为你需要参数名。要使用下面的代码,您需要将反射添加为依赖项as explained in the documentation。
private fun listNullProperties (vararg props: KProperty0<Any?>) : List<String> {
val list = mutableListOf<String>()
for (prop in props)
if (param.get() == null)
list.add(param.name)
return list
}用法:
val nullPropertiesByName = listNullParameters(
::myProperty,
::myOtherProperty,
::myDateProperty
)
println(nullPropertiesByName.joinToString())发布于 2019-10-01 20:41:43
如果仅仅是关于日志记录,那么您可以
fun <T> T?.logNull(name: String) {
when(this) {
null -> //log '$name' was null
else -> //do nothing
}
}并将其命名为
var a: String? = null
a.logNull("my a variable") // "'my a variable' was null"发布于 2019-10-01 21:53:26
我仍然推荐Map-approach。您可能希望使用properties stored in a map来克服反射的使用。
下面是一个使用两个日期和两个字符串的类型的示例,这两个类型都有一个可以为空的变量和一个非空变量:
class YourData(internal val backedMap : Map<String, Any?>) {
val beginDate : Date by backedMap
val endDate : Date? by backedMap
val maybeString : String? by backedMap
val string : String by backedMap
constructor(beginDate : Date, string : String, endDate: Date? = null, maybeString : String? = null) : this(mapOf(
"beginDate" to beginDate,
"endDate" to endDate,
"maybeString" to maybeString,
"string" to string
))
}虽然有了这个额外的构造函数看起来更复杂,但它只是有助于以您最熟悉的方式轻松创建新对象。
现在,您可以提供我放在注释中的函数,也可以提供它的任何变体。我现在改用YourData的扩展函数:
fun YourData.getKeysWithNullValues() = backedMap.filterValues { it == null }.keys用法可能如下所示:
YourData(Date(), "test string")
.getKeysWithNullValues()
.forEach(::println)在本例中,它将打印:
endDate
maybeStringhttps://stackoverflow.com/questions/58183476
复制相似问题