Java Kotlin:如果条件为true,则将变量转换为不可为null的

Java Kotlin:如果条件为true,则将变量转换为不可为null的,java,android,kotlin,Java,Android,Kotlin,我的意思是跟随 考虑以下代码: // Can be a Long or null val data1= param1.toLongOrNull() val data2= param2.toLongOrNull() val dataN= paramN.toLongOrNull() // Proceed with the action if ALL of the data are not nulls if(notNull(data1, data2, dataN)){ // do somet

我的意思是跟随

考虑以下代码:

// Can be a Long or null
val data1= param1.toLongOrNull()
val data2= param2.toLongOrNull()
val dataN= paramN.toLongOrNull()

// Proceed with the action if ALL of the data are not nulls
if(notNull(data1, data2, dataN)){
    // do something with data1,2,N
}
notNull()
是一个接受变量参数列表的实用函数。 如果所有参数都不是null,则返回true

fun <T> notNull(vararg elements: T): Boolean {
    elements.forEach {
        if (it == null) {
            return false
        }
    }
    return true
}
另一方面,如果显式检查变量是否为null,那么Kotlin知道这很好,并且不会抱怨

if(data1!=null && data2!=null && dataN!=null){
     data1 + data2 + dataN
}
最好以这种方式“配置”notNull方法,以便Kotlin知道,一旦返回true,块内传递的任何参数都不能为null。

这可能吗?

显然有多种方法可以剥猫皮,但你可以这样做:

inline fun <T> doIfNotNull(elements: Array<T?>, block : (Array<T>) -> Unit) {
    val validElements = arrayListOf<T>()
    for (i in elements) {
       if (i == null) return
       validElements.add(i)
    }
    block.invoke(validElements.toArray(elements))
}

我认为没有办法用合同来做到这一点。我试过了,但无法理解瓦拉格的部分。另一方面,您可以在
notNull
函数体中执行此操作:
elements.all{it!=null}
并且它可以成为单个表达式。这更清楚,谢谢@Todd!直到现在我才知道合同的事。看起来很有趣,是的,人们可以用它来告诉Kotlin更多关于函数的信息,不幸的是,它非常有限。我无法将其用于我的用例。我所寻找的更像是Kotlin合同,然而,您的示例是一个很好的替代方案。非常感谢。和你一样,我直到现在才听说科特林的合同。
inline fun <T> doIfNotNull(elements: Array<T?>, block : (Array<T>) -> Unit) {
    val validElements = arrayListOf<T>()
    for (i in elements) {
       if (i == null) return
       validElements.add(i)
    }
    block.invoke(validElements.toArray(elements))
}
inline fun <T> doIfNotNull(block : (Array<T>) -> Unit, vararg elements : T?) {
    val validElements = arrayListOf<T>()
    for (i in elements) {
       if (i == null) return
       validElements.add(i)
    }
    block.invoke(validElements.toArray(elements))
}
fun test() {
    val elements = arrayOf(1L, 2L, null)
    doIfNotNull(elements, {
        it.sum()
    })
}