在Kotlin中使用RXJava地图?

为什么这是抱怨一个错过类型? map应该将可观测值的值转换为另一个值,但是期望我从地图返回可观察值

 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) } }) } 

这部分代码

 .map { snapshot: DataSnapshot? -> object: List<Exercise> 

说lambda接收的snapshot参数的类型是DataSnapshot? -> object: List<Exercise> DataSnapshot? -> object: List<Exercise> (实际上它不是一个有效的函数类型,那就是DataSnapshot? -> List<Exercise> )。

我相信你实际上想要做的是一个snapshot参数,只是类型DataSnapshot

 .map { snapshot: DataSnapshot? -> listOf<Exercise>() } 

lambda的返回类型不一定要在这里指定,它只会被推断出来。 你也不需要在lambda中使用return关键字,因为它的最后一个表达式是返回的。

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

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

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

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

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

就像@ zsmb13所说的那样,大多数情况下不需要return 。 如果您真的想要(用于流量控制),您可以使用合格的退货 :

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