android - 在 Kotlin 中使用 RXJava 映射?

标签 android kotlin rx-java

为什么这是一个 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/

相关文章:

Android:如何设置相对于 PercentLayout/ConstraintLayout 的文本字体大小

android - 防止另一个应用程序启动启动器/主要 Activity

android - Mockito Stubbed Spy 有时会调用有时不会调用被侦测对象的方法

android - RxJava 缓存网络调用

android - 单击按钮时如何提供 SlideUp 效果

java - Android中的分页文本

java - 处理Activity中多线程的加载状态

android - 列表项属性更改时,Livedata 不会更新撰写状态

android - RxJava : catch exception properly

android - RXJava - 拆分和合并 Observable