为什么这是一个 miss-type 的提示? map
应该将一个 observable 的值转换为另一个,但它期望我从 map 返回一个 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)
}
})
}
最佳答案
@zsmb13 已经指出了正确答案。在这里,我想评论一下您在 lambda 表达式中犯的一些错误。
.map { snapshot: DataSnapshot? -> object: List<Exercise>
// Error here
return listOf<Exercise>()
}
object: List<Exercise>
这不是一个有效的语法,因为主体在 ->
之后在 lambda 表达式中签名。我们不在主体内指定返回类型。
另外,return
这里的意思是从fetchExercises()
返回如 Kotlin docs 中所述:
A return statement without a label always returns from the function declared with the fun keyword. This means that a return inside a lambda expression will return from the enclosing function, whereas a return inside an anonymous function will return from the anonymous function itself.
正如@zsmb13 所说,return
在大多数情况下不需要。如果你真的想要它(用于流量控制),你可以使用 qualified returns :
//This is answer from @zsmb13
.map { snapshot: DataSnapshot? ->
return@map listOf<Exercise>()
}
关于android - 在 Kotlin 中使用 RXJava 映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45667360/