在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>() }
- 在onCreateView android视图是null
- Kotlin并行协程
- 使用ColorStateList的Android FAB setBackgroundTintList不起作用
- GridView只在单击项目时删除第一个项目。 基于Java>Kotlin
- Android Room:查询中的每个绑定变量都必须具有匹配的方法
- 在Kotlin中开发的Android库模块导出到Java应用程序导致失败的解决方案:Lkotlin / jvm / internal / Intrinsics
- kapt构建失败与匕首Android处理器
- 以编程方式使用变量使imageView可见/不可见
- 没有类型参数的乐趣findViewById(p0:Int):视图