【问题标题】:Kotlin expandable null checking [duplicate]Kotlin 可扩展空值检查 [重复]
【发布时间】:2018-12-02 08:56:32
【问题描述】:

我有一个方法如下:

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 的任何/所有变量放入列表/集合中,然后使用单个方法在回调中恢复结果(如果有)?

更具体地说,我可以像这样使用当前方法:

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

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

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

如果有任何类似的东西,或者我需要的更好的做法,请告诉我。谢谢。

【问题讨论】:

    标签: generics kotlin


    【解决方案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
    

    【讨论】:

    • 问题在于,一旦function 参数需要访问正确类型的输入,您需要编写类似ifNotNull(1, 2, 3) { list -&gt; val x = list[0] as Int; ... } 的内容。呸。对于所有参数都是相同类型的情况,它至少可以改进。
    • 是的。但是由于 example 使用了三种不同的类型,我决定在这里放弃泛型。
    【解决方案2】:

    您需要正确地做的是具有可变数量类型参数的泛型,而 Kotlin 没有。实际上,我所知道的唯一一种确实有类似内容的语言是C++

    否则你会:

    1. 在 Alexey Soshin 的回答中丢失类型和/或参数数量

    2. 必须为不同数量的参数引入类,这比为每个数量的参数声明方法要多。

    【讨论】:

    • 如果要求 any 类型的 all 参数不为空 - 为什么您的第 1 点会出现问题?
    • @DavidSoroko 请查看我对 Alexey 回答的评论。
    • 对,这是关于实际处理而不是输入验证,我同意。
    【解决方案3】:

    以下可能的一些变体:

    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) 摆脱 !!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-21
      • 2012-03-01
      • 2011-11-25
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      相关资源
      最近更新 更多