10

在连接到蓝牙设备的应用程序中,我使用 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

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

4

2 回答 2

33

在您的地图函数中替换语句

return socket

return@map socket

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

于 2017-05-05T14:43:53.473 回答
0

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

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

建议避免使用带标签的表达式,例如return@map,因为可维护性和复杂性较低。

val使用而不是这些变量也是一个很好的做法var,因为您不会重新分配它们。

于 2021-02-03T06:40:33.413 回答