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()
})
}