K.O*_*.Os 4 kotlin kotlin-null-safety
我有一个简单的功能检查,如下所示:
fun parseValidBluetoothBrickedId(controllerId: String?): Boolean{
if(controllerId != null){
if(controllerId.startsWith(BLUETOOTH_NAME_PREFIX) && controllerId.length > BLUETOOTH_NAME_PREFIX.length)
return true
}
return false
}
Run Code Online (Sandbox Code Playgroud)
我想将它转换为更简单的风格:
fun parseValidBluetoothBrickedId(controllerId: String?) =
controllerId?.length > BLUETOOTH_NAME_PREFIX.length
&& controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)
Run Code Online (Sandbox Code Playgroud)
但IDE(Android Studio 3.0 Beta7)给我一个错误,强调大于('>')运算符:
操作员调用对应于点限定调用'controllerId?.length.compareTo(BLUETOOTH_NAME_PREFIX.length),此处不允许
它还强调为错误行controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)并说:
类型不匹配.必需:Boolean,Found Boolean?
有什么问题,真的吗?它只是一个简单的方法,适用于第一个块if-else风格.
您不能调用compareTo(使用<运算符)controllerId?.length,因为它的类型是Int?,这意味着它可能是null,在这种情况下,它不能作为数字进行比较.
类似地,controllerId?.startsWith(BLUETOOTH_NAME_PREFIX)调用返回Boolean?(因为它将返回,null如果controllerId是null),它不能传递给&&运算符,只有真正的Boolean可以.
这里的解决方案是null检查您在原始方法中执行的操作,并依靠智能转换controllerId来摆脱安全调用String:
fun parseValidBluetoothBrickedId(controllerId: String?): Boolean =
controllerId != null
&& controllerId.length > BLUETOOTH_NAME_PREFIX.length
&& controllerId.startsWith(BLUETOOTH_NAME_PREFIX)
Run Code Online (Sandbox Code Playgroud)