在Kotlin中使用RXJava地图?

时间:2017-08-14 04:11:54

标签: android kotlin rx-java

为什么这会抱怨错过类型? 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)
        }
    })
}

2 个答案:

答案 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>()
}