Kotlin可扩展null检查

时间:2018-12-02 08:56:33

标签: generics kotlin

我有如下方法:

fun <T1, T2, T3> ifCoordsNotNull(v1: T1?, v2: T2?, v3: T3?, allNotNull: (T1, T2, T3) -> (Unit)) {
    if (v1 != null && v2 != null && v3 != null) {
        allNotNull(v1, v2, v3)
    }
}

我知道这是一种检查多个值是否为null的方法;但是,除非我制定几种相关方法,否则它似乎并不能满足我的需求。

有没有一种方法可以将需要检查null的所有/所有变量放入列表/集中,然后使用单个方法在回调中恢复结果(如果有)?

更具体地说,我可以使用如下所示的当前方法:

ifCoordsNotNull(loc["x"], loc["y"], loc["z"]) { x, y, z ->

但如果可能的话,宁愿创建一种更符合人体工程学的方法,该方法可以在许多情况下工作:

ifNotNull(linkedSetOf(loc["x"], loc["y"], loc["z"])) { x, y, z ->

如果有类似的事情,或者我需要更好的做法,请告诉我。谢谢。

3 个答案:

答案 0 :(得分:-1)

您可以使用vararg关键字和filterNotNull,例如:

fun ifNotNull(vararg input: Any?, function: (s: List<Any>) -> Unit) {
    val list = input.filterNotNull().toList()

    if (list.size != input.size) {
        throw RuntimeException()
    }

    function(list)
}

结果将是:

ifNotNull(1, 2, 3) {
    println(it)
} // [1, 2, 3]

ifNotNull("a", 1, null) {
    println(it)
} // Throws

答案 1 :(得分:-1)

您需要正确执行的操作是具有可变数量的类型参数的泛型,而Kotlin没有。实际上,我所知道的唯一具有这种功能的语言是C++

否则,您将:

  1. 丢失类型和/或参数数量,如Alexey Soshin的答案

  2. 必须为不同数量的参数引入类,与为每种数量的参数声明方法相比,最终要做的工作更多。

答案 2 :(得分:-1)

以下可能是一些变体:

fun check(vars: Array<Any?>): Boolean = vars.filterNotNull().size == vars.size


fun <T1, T2, T3> ifCoordsNotNull(v1: T1?, v2: T2?, v3: T3?, allNotNull: (T1, T2, T3) -> (Unit)) {
    if (check(arrayOf(v1, v2, v3))) {
        allNotNull(v1!!, v2!!, v3!!)
    }
}

您也许可以使用合同(https://kotlinlang.org/docs/reference/whatsnew13.html#contracts)摆脱!!