Rx Kotlin:map函数无法推断返回类型

时间:2017-05-05 14:04:38

标签: android reactivex rx-kotlin

在连接蓝牙设备的应用中,我使用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,它找到了BluetoothSocket,其中需要Unit

这里出了什么问题?我认为地图应该能够推断出返回类型。

2 个答案:

答案 0 :(得分:24)

在地图功能中替换语句

return socket

return@map socket

因为 return 语句通常用于返回顶级函数的值。对于lambda表达式和内联(嵌套)函数,请使用标签返回,即 return @ {method_name} 。在这种情况下,您也可以将最后一行留给 socket ,编译器将为您处理它,假设最后一行是内联函数的返回值。但为了更好的可读性,我肯定更喜欢合格的返回语法。您可以在kotlin文档herehere

中阅读更多详细信息

答案 1 :(得分:0)

在这种情况下,只需简单地跳过使用 return 关键字!最后一条语句将是返回表达式:

.map {
  val uuid: UUID = BLUETOOTH_UUID
  val socket = it.createRfcommSocketToServiceRecord(uuid)
  socket.connect()
  socket
}

建议避免使用像 return@map 这样的标记表达式,因为它具有可维护性和较低的复杂性。

对这些变量使用 val 而不是 var 也是一个好习惯,因为您不需要重新分配它们。