Android Rx Kotlin:map功能可以';不能推断返回类型
在连接到蓝牙设备的应用程序中,我使用RxKotlin使用以下功能:Android Rx Kotlin:map功能可以';不能推断返回类型,android,reactivex,rx-kotlin,Android,Reactivex,Rx Kotlin,在连接到蓝牙设备的应用程序中,我使用RxKotlin使用以下功能: private fun startBluetoothPair(device: BluetoothDevice) { Observable.just(device) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map { var uuid: UUID
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
}
}
该函数只需在后台与Bluetooth设备连接,然后对套接字执行某些操作(再次在主线程中)。但是,映射
无法处理返回套接字
部分,告诉我存在类型不匹配
,它在需要单元的地方找到了一个BluetoothSocket
这里出了什么问题?我认为映射应该能够推断返回类型。在映射函数中替换该语句
return socket
与
因为return语句通常用于返回顶级函数的值。对于lambda表达式和内联(嵌套)函数,在标签处使用返回,即return@{method_name}。在这种情况下,您也可以将最后一行保留为socket,编译器将为您处理它,假定最后一行是内联函数的返回值。但为了更好的可读性,我肯定更喜欢限定的返回语法。您可以在kotlin文档中阅读更多详细信息,在本例中,只需跳过使用return
关键字即可!最后一条语句将是返回表达式:
.map {
val uuid: UUID = BLUETOOTH_UUID
val socket = it.createRfcommSocketToServiceRecord(uuid)
socket.connect()
socket
}
建议避免使用带标签的表达式,如return@map
,因为它的可维护性和复杂性更低
对这些变量使用val
而不是var
也是一种很好的做法,因为您没有重新分配它们。您尝试过return@scan
而不是返回
?@Rehan:谢谢你,这很有效!(或者至少,它不再抱怨了,现在无法测试)但对我来说,scan
看起来像是纯粹的魔法。。这有什么用?需要详细说明吗?它用于避免在嵌套函数中出现歧义和返回值,就像上面的例子一样。自从我上周更新kotlin插件以来,我已经看到android studio建议更多了。你可以阅读更多细节:)谢谢你,伙计,谢谢你!我想让Kotlin map做我需要它做的事,真是疯了。为什么不像其他语言已经做的那样呢?
.map {
val uuid: UUID = BLUETOOTH_UUID
val socket = it.createRfcommSocketToServiceRecord(uuid)
socket.connect()
socket
}