为什么这会抱怨错过类型? 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)
}
})
}
答案 0 :(得分:4)
这部分代码
.map { snapshot: DataSnapshot? -> object: List<Exercise>
表示此lambda接收的snapshot
参数的类型为DataSnapshot? -> object: List<Exercise>
(实际上它不是有效的函数类型,即DataSnapshot? -> List<Exercise>
)。
我相信您真正想要做的是以下snapshot
参数,其类型为DataSnapshot
:
.map { snapshot: DataSnapshot? ->
listOf<Exercise>()
}
这里不必指定lambda的返回类型,只是推断它。您也不需要在lambda中使用return
关键字,因为其中的最后一个表达式是返回的内容。
答案 1 :(得分:4)
@ zsmb13在那里指出了正确的答案。在这里,我想评论一下你的lambda表达式中的一些错误。
.map { snapshot: DataSnapshot? -> object: List<Exercise>
// Error here
return listOf<Exercise>()
}
object: List<Exercise>
这里不是有效的语法,因为正文在lambda表达式中的->
符号之后。我们没有在正文中指定返回类型。
此外,此处的return
表示按Kotlin docs中的说明从fetchExercises()
返回:
没有标签的return语句总是从fun关键字声明的函数返回。这意味着lambda表达式中的返回将从封闭函数返回,而匿名函数内的返回将从匿名函数本身返回。
正如@ zsmb13所说,在大多数情况下不需要return
。如果你真的想要它(用于流量控制),你可以使用qualified returns:
//This is answer from @zsmb13
.map { snapshot: DataSnapshot? ->
return@map listOf<Exercise>()
}