Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 替换非空断言运算符"&引用;做一个数学表达式_Kotlin - Fatal编程技术网

Kotlin 替换非空断言运算符"&引用;做一个数学表达式

Kotlin 替换非空断言运算符"&引用;做一个数学表达式,kotlin,Kotlin,在下面的代码中,在减去两个字段之前,对它们执行null检查: if ((testingStartTime != null) && (testingEndTime != null)) summary.duration = testingEndTime!!.time - testingStartTime!!.time 是否可以删除NOTNULL断言运算符以某种方式执行减法?更好的方法是执行上述代码,而不检查if语句中两者是否均为null。您可以这样做: summary.du

在下面的代码中,在减去两个字段之前,对它们执行null检查:

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