首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin多变量Null检查器方法实现

Kotlin多变量Null检查器方法实现
EN

Stack Overflow用户
提问于 2019-10-01 19:02:06
回答 3查看 219关注 0票数 0

我有多个可以为空的变量,我需要检查它们(字符串和日期)。

我需要一个方法,在这个方法中,我向它传递X个变量,它会返回一个变量列表,这些变量都是空的。

我在想一个我可以这么叫的东西:

代码语言:javascript
复制
internal fun checkNullVariables ( var x, var y , ..... ) : MutableList<String>{

    // yada yada

    return listOfNamesOfNullVariables
}
EN

回答 3

Stack Overflow用户

发布于 2019-10-01 21:39:27

这肯定需要反射,因为你需要参数名。要使用下面的代码,您需要将反射添加为依赖项as explained in the documentation

代码语言:javascript
复制
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
}

用法:

代码语言:javascript
复制
val nullPropertiesByName = listNullParameters(
    ::myProperty,
    ::myOtherProperty,
    ::myDateProperty
)
println(nullPropertiesByName.joinToString())
票数 1
EN

Stack Overflow用户

发布于 2019-10-01 20:41:43

如果仅仅是关于日志记录,那么您可以

代码语言:javascript
复制
fun <T> T?.logNull(name: String) {
    when(this) {
        null -> //log '$name' was null
        else -> //do nothing
    }
}

并将其命名为

代码语言:javascript
复制
var a: String? = null
a.logNull("my a variable") // "'my a variable' was null"
票数 0
EN

Stack Overflow用户

发布于 2019-10-01 21:53:26

我仍然推荐Map-approach。您可能希望使用properties stored in a map来克服反射的使用。

下面是一个使用两个日期和两个字符串的类型的示例,这两个类型都有一个可以为空的变量和一个非空变量:

代码语言:javascript
复制
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的扩展函数:

代码语言:javascript
复制
fun YourData.getKeysWithNullValues() = backedMap.filterValues { it == null }.keys

用法可能如下所示:

代码语言:javascript
复制
YourData(Date(), "test string")
  .getKeysWithNullValues()
  .forEach(::println)

在本例中,它将打印:

代码语言:javascript
复制
endDate
maybeString
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58183476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档