6

我有一个简单的功能检查,如下所示:

    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?.length.compareTo(BLUETOOTH_NAME_PREFIX.length) ,此处不允许

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

类型不匹配。必需:布尔值,找到布尔值?

真的是什么问题?这只是一个简单的方法,适用于第一个块 if-else 样式。

4

3 回答 3

9

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

同样,controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)调用返回Boolean?(因为它会返回nullif controllerIdis null),它不能传递给&&操作员,只有一个真正的Boolean可以。

这里的解决方案是null检查您在原始方法中所做的检查,并通过依靠智能转换来摆脱安全controllerId调用String

fun parseValidBluetoothBrickedId(controllerId: String?): Boolean =
        controllerId != null 
        &&  controllerId.length > BLUETOOTH_NAME_PREFIX.length
        &&  controllerId.startsWith(BLUETOOTH_NAME_PREFIX)
于 2017-10-09T08:51:55.160 回答
2

当你这样做时controllerId?.length,你会得到一个Int?. 您无法IntInt?. 这就是你得到第一个错误的原因。

你得到另一个错误,因为controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)返回Boolean?。您不能&&在可为空的参数上使用运算符。它需要两个类型的参数Boolean

要解决问题,您需要先检查controllerId != null。这将智能controllerId转换为不可为空的类型String。像这样:

fun parseValidBluetoothBrickedId(controllerId: String?): Boolean =
    controllerId != null
        && controllerId.startsWith(BLUETOOTH_NAME_PREFIX)
        && controllerId.length > BLUETOOTH_NAME_PREFIX.length
于 2017-10-09T08:51:06.650 回答
1

您转换后的函数缺少null检查:

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

与您的第一个示例一样,编译器需要进行空检查,这controllerId 不是null. 检查后,编译器使用“智能转换”并且调用是安全的。因此,您不必?.在检查后使用符号。

于 2017-10-09T08:49:39.160 回答