Kotlin 替换非空断言运算符"&引用;做一个数学表达式
在下面的代码中,在减去两个字段之前,对它们执行null检查:Kotlin 替换非空断言运算符"&引用;做一个数学表达式,kotlin,Kotlin,在下面的代码中,在减去两个字段之前,对它们执行null检查: if ((testingStartTime != null) && (testingEndTime != null)) summary.duration = testingEndTime!!.time - testingStartTime!!.time 是否可以删除NOTNULL断言运算符以某种方式执行减法?更好的方法是执行上述代码,而不检查if语句中两者是否均为null。您可以这样做: summary.du
if ((testingStartTime != null) && (testingEndTime != null))
summary.duration = testingEndTime!!.time - testingStartTime!!.time
是否可以删除NOTNULL断言运算符代码>以某种方式执行减法?更好的方法是执行上述代码,而不检查if语句中两者是否均为null。您可以这样做:
summary.duration = testingEndTime?.let { endTime ->
testingStartTime?.let { startTime ->
endTime - startTime
}
}
如果testingEndTime
或testingStartTime
为null
,则将null
分配给summary.duration
。如果您希望在任一从属值为null
时使用默认值,则可以执行以下操作:
summary.duration = testingEndTime?.let { endTime ->
testingStartTime?.let { startTime ->
endTime - startTime
}
} ?: 0
或者,如果您根本不想更改summary.duration
的值,如果其中一个从属值为null,您可以执行以下操作:
summary.duration = if (testingEndTime != null && testingStartTime != null) {
testingEndTime - testingStartTime
} else {
summary.duration
}
你可以这样做:
summary.duration = testingEndTime?.let { endTime ->
testingStartTime?.let { startTime ->
endTime - startTime
}
}
如果testingEndTime
或testingStartTime
为null
,则将null
分配给summary.duration
。如果您希望在任一从属值为null
时使用默认值,则可以执行以下操作:
summary.duration = testingEndTime?.let { endTime ->
testingStartTime?.let { startTime ->
endTime - startTime
}
} ?: 0
或者,如果您根本不想更改summary.duration
的值,如果其中一个从属值为null,您可以执行以下操作:
summary.duration = if (testingEndTime != null && testingStartTime != null) {
testingEndTime - testingStartTime
} else {
summary.duration
}
这个怎么样:
fun main() {
val x: Int? = null
val y: Int? = 5
val z = x-y
print(z)
}
operator fun Int?.minus(x: Int?) : Int? {
this ?: return null
x ?: return null
return this-x
}
我知道这是一个太多的代码,但它可能会在多个地方使用 这个怎么样:
fun main() {
val x: Int? = null
val y: Int? = 5
val z = x-y
print(z)
}
operator fun Int?.minus(x: Int?) : Int? {
this ?: return null
x ?: return null
return this-x
}
我知道这是一个太多的代码,但它可能会在多个地方使用 您似乎将testingStartTime和testingEndTime声明为可变变量(var),因此无法将智能转换为不可为null的类型。有两种惯用方法可以解决您的问题:
将testingStartTime和testingEndTime声明为不可变变量(val)(如果可能)
创建这些变量的两个本地不可变副本,并使用它们使智能强制转换成为可能:
似乎您将testingStartTime和testingEndTime声明为可变变量(var),因此无法将智能转换为不可为null的类型。有两种惯用方法可以解决您的问题:
将testingStartTime和testingEndTime声明为不可变变量(val)(如果可能)
创建这些变量的两个本地不可变副本,并使用它们使智能强制转换成为可能:
您已经预先检查了空值,因此理想情况下,代码>是不需要的
Kotlin通常会将这些变量智能转换为非null类型,但这可能会被阻止,因为它们是可变的类属性。
要解决此问题,只需将它们分配给局部变量:
val start=testingStartTime
val end=testingEndTime
如果(开始!=null&&end!=null){
summary.duration=start.time-end.time
}
这与您的代码具有相同的行为,是的,使用了更多的行,但在我看来看起来更干净。如果你真的不想重新分配变量,你也可以将它们作为函数参数传递。你已经事先检查过空值,所以理想情况下代码>是不需要的
Kotlin通常会将这些变量智能转换为非null类型,但这可能会被阻止,因为它们是可变的类属性。
要解决此问题,只需将它们分配给局部变量:
val start=testingStartTime
val end=testingEndTime
如果(开始!=null&&end!=null){
summary.duration=start.time-end.time
}
这与您的代码具有相同的行为,是的,使用了更多的行,但在我看来看起来更干净。如果确实不想重新分配变量,也可以将其作为函数参数传递。例如,如果简洁性对您很重要,则可以组合使用接收器或参数的作用域函数,这样您就不必命名参数。可读性可能有问题
testingStartTime?.let { testingEndTime?.run { summary.duration = it.time - this.time } }
或
如果简洁性对您很重要,您可以组合作用域函数,交替使用接收器或参数,这样您就不必命名参数。可读性可能有问题
testingStartTime?.let { testingEndTime?.run { summary.duration = it.time - this.time } }
或
为了好玩,你可以这样做:
operator fun Double?.minus(other: Double?) =
if (this == null || other == null) null else this - other
然后使用
summary.duration = (testingStartTime?.time - testingEndTime?.time)?: summary.duration
但不建议对原语重载运算符,因为这会使其他地方的代码难以辨认。为了好玩,您可以这样做:
operator fun Double?.minus(other: Double?) =
if (this == null || other == null) null else this - other
然后使用
summary.duration = (testingStartTime?.time - testingEndTime?.time)?: summary.duration
但不建议对原语重载运算符,因为这可能会使代码在其他地方难以辨认。是否希望summary.duration为null,或者如果null检查不成功,则使用默认值?summary duration从不为null。我在回答中介绍了3种可能的情况,最下面的情况可能就是此用例所需的情况,但是它是否比你已经拥有的更可读/简洁/优雅,这是有争议的。什么要求你添加代码>?它在Android Studio中编译得很好,没有代码>如果我有if
检查。是的,一旦进入“如果编译器应该智能地将2个值强制转换为不可空值]您希望summary.duration为空还是在空检查不成功时具有默认值?summary duration从不为空。我在回答中介绍了3种可能的情况,最底层可能是这个用例所需要的,但是它是否比您已经拥有的更可读/简洁/优雅,这是有争议的。什么要求您添加代码>?它在Android Studio中编译得很好,没有代码>如果我有if
检查。是的,一旦进入if编译器应该智能地将2个值强制转换为不可空]是的,但这将我从2行代码转换为5行。我想没有更简单的方法了。你只需要第二个?:0
。是的,你是对的。原因是(对于OP),如果最内部的表达式计算为null,最外部的表达式将回退到null合并?:
运算符并解析为0。我将编辑answe