Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Rx Kotlin:map功能可以';不能推断返回类型_Android_Reactivex_Rx Kotlin - Fatal编程技术网

Android Rx Kotlin:map功能可以';不能推断返回类型

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

在连接到蓝牙设备的应用程序中,我使用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
        }
}
该函数只需在后台与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
}