我有一个简单的功能检查,像这样:

    fun parseValidBluetoothBrickedId(controllerId: String?): Boolean{
    if(controllerId != null){
        if(controllerId.startsWith(BLUETOOTH_NAME_PREFIX) && controllerId.length > BLUETOOTH_NAME_PREFIX.length)
            return true
    }

    return false
}

我想将其转换为更简单的样式:
   fun parseValidBluetoothBrickedId(controllerId: String?) =
        controllerId?.length > BLUETOOTH_NAME_PREFIX.length
      &&  controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)

但是IDE(Android Studio 3.0 Beta7)给我一个错误,强调了大于('>')运算符:



此外,它还作为错误行controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)下划线并说:



到底是什么问题?这只是一种简单的方法,可以与第一块if-else样式一起使用。

最佳答案

您不能在compareTo上调用<(使用controllerId?.length运算符),因为它的类型是Int?,这意味着它可能是null,在这种情况下,不能将其与数字进行比较。

同样,controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)调用返回Boolean?(如果nullcontrollerId,则它将返回null),该调用不能传递给&&运算符,只有真实的Boolean可以传递。

此处的解决方案是执行您在原始方法中所做的null检查,并依靠将您的controllerId转换为String的智能强制转换来摆脱安全调用:

fun parseValidBluetoothBrickedId(controllerId: String?): Boolean =
        controllerId != null
        &&  controllerId.length > BLUETOOTH_NAME_PREFIX.length
        &&  controllerId.startsWith(BLUETOOTH_NAME_PREFIX)

08-05 20:04