Kotlin 中 RXJava 地图的使用?

ary*_*axt 4 android kotlin rx-java

为什么这是抱怨小姐类型?map应该将一个 observable 的值转换为另一个,但它希望我从地图中返回一个 observable

override fun fetchExercises(): Observable<List<Exercise>> {
    return FirebaseDatabase.getInstance()
        .getReference("exercises")
        .observeSingleEvent()
        .map { snapshot: DataSnapshot? -> object: List<Exercise>
            // Error here
            return listOf<Exercise>()
        }
    }

fun DatabaseReference.observeSingleEvent(): Observable<DataSnapshot> {
    return Observable.create(object : Observable.OnSubscribe<DataSnapshot> {
        override fun call(subscriber: Subscriber<in DataSnapshot>) {

            val valueEventListener = object: ValueEventListener {
                override fun onDataChange(snapshot: DataSnapshot?) {
                    subscriber.onNext(snapshot)
                    subscriber.onCompleted()
                }

                override fun onCancelled(error: DatabaseError?) {
                    subscriber.onError(FirebaseDatabaseThrowable(error))
                }
            }

            addListenerForSingleValueEvent(valueEventListener)
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

Bak*_*aii 6

@zsmb13 在那里指出了正确的答案。在这里,我想评论一下您在 lambda 表达式中犯的一些错误。

.map { snapshot: DataSnapshot? -> object: List<Exercise>
        // Error here
        return listOf<Exercise>()
}
Run Code Online (Sandbox Code Playgroud)

object: List<Exercise>这里不是一个有效的语法,因为主体->在 lambda 表达式中的一个符号之后。我们没有在正文中指定返回类型。

此外,return这里的意思是从Kotlin 文档中fetchExercises()描述的返回:

没有标签的 return 语句总是从用 fun 关键字声明的函数返回。这意味着 lambda 表达式内的 return 将从封闭函数返回,而匿名函数内的 return 将从匿名函数本身返回。

正如@zsmb13 所说,return在大多数情况下不需要。如果你真的想要它(用于流量控制),你可以使用限定返回

//This is answer from @zsmb13
.map { snapshot: DataSnapshot? ->
    return@map listOf<Exercise>()
}
Run Code Online (Sandbox Code Playgroud)


zsm*_*b13 5

这部分代码

.map { snapshot: DataSnapshot? -> object: List<Exercise>
Run Code Online (Sandbox Code Playgroud)

表示snapshot此 lambda 接收的参数类型是DataSnapshot? -> object: List<Exercise>(实际上不是有效的函数类型,即DataSnapshot? -> List<Exercise>)。

我相信你真正想做的是以下,一个snapshot只有类型的参数DataSnapshot

.map { snapshot: DataSnapshot? ->
    listOf<Exercise>()
}
Run Code Online (Sandbox Code Playgroud)

无需在此处指定 lambda 的返回类型,只需推断即可。您也不需要return在 lambda 中使用关键字,因为它的最后一个表达式是返回的内容。