Rx Kotlin:映射函数无法推断 return 类型
Rx Kotlin: map function can't infer return type
在连接到蓝牙设备的应用程序中,我使用 RxKotlin 使用以下函数:
private fun startBluetoothPair(device: BluetoothDevice) {
Observable.just(device)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map {
var uuid: UUID = BLUETOOTH_UUID
var socket = it.createRfcommSocketToServiceRecord(uuid)
socket.connect()
return socket
}
.subscribe {
// Do something with the BluetoothSocket
}
}
这个函数应该简单地在后台连接蓝牙设备,然后对套接字做一些事情(再次在主线程中)。但是,map
无法处理 return socket
部分,告诉我有一个 Type mismatch
,它在需要 Unit
的地方找到了一个 BluetoothSocket
。
这里出了什么问题?我认为地图应该能够推断出 return 类型。
在您的地图函数中替换语句
return socket
与
return@map socket
因为return 语句通常用于return 顶级函数的值。对于 lambda 表达式和内联(嵌套)函数,在标签处使用 returns,即 return@{method_name}。在这种情况下,您也可以将最后一行保留为 socket
,编译器将为您处理它,假设最后一行作为内联函数的 return 值.但是为了更好的可读性,我肯定会更喜欢合格的 return 语法。您可以在 kotlin 文档中阅读更多详细信息 here and here
在这种情况下,只需跳过使用 return
关键字即可!最后一条语句将是 return 表达式:
.map {
val uuid: UUID = BLUETOOTH_UUID
val socket = it.createRfcommSocketToServiceRecord(uuid)
socket.connect()
socket
}
建议避免使用像 return@map
这样的带标签的表达式,因为它易于维护且复杂性较低。
对这些变量使用 val
而不是 var
也是一个好习惯,因为您不会重新分配它们。
在连接到蓝牙设备的应用程序中,我使用 RxKotlin 使用以下函数:
private fun startBluetoothPair(device: BluetoothDevice) {
Observable.just(device)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map {
var uuid: UUID = BLUETOOTH_UUID
var socket = it.createRfcommSocketToServiceRecord(uuid)
socket.connect()
return socket
}
.subscribe {
// Do something with the BluetoothSocket
}
}
这个函数应该简单地在后台连接蓝牙设备,然后对套接字做一些事情(再次在主线程中)。但是,map
无法处理 return socket
部分,告诉我有一个 Type mismatch
,它在需要 Unit
的地方找到了一个 BluetoothSocket
。
这里出了什么问题?我认为地图应该能够推断出 return 类型。
在您的地图函数中替换语句
return socket
与
return@map socket
因为return 语句通常用于return 顶级函数的值。对于 lambda 表达式和内联(嵌套)函数,在标签处使用 returns,即 return@{method_name}。在这种情况下,您也可以将最后一行保留为 socket
,编译器将为您处理它,假设最后一行作为内联函数的 return 值.但是为了更好的可读性,我肯定会更喜欢合格的 return 语法。您可以在 kotlin 文档中阅读更多详细信息 here and here
在这种情况下,只需跳过使用 return
关键字即可!最后一条语句将是 return 表达式:
.map {
val uuid: UUID = BLUETOOTH_UUID
val socket = it.createRfcommSocketToServiceRecord(uuid)
socket.connect()
socket
}
建议避免使用像 return@map
这样的带标签的表达式,因为它易于维护且复杂性较低。
对这些变量使用 val
而不是 var
也是一个好习惯,因为您不会重新分配它们。