RxJava2将Flowable转换为Single

13
如何将Flowable转换为Single?或者是否有其他方法可以在第一次响应后停止发射。我尝试了以下方法,但似乎无效:
  disposables.add(
        repository.getAllSomethings()
           .subscribeOn(SchedulerProvider.getInstance().computation())
           .observeOn(SchedulerProvider.getInstance().ui())
           .toSingle()
           .subscribeWith(object : DisposableSingleObserver<List<Something>>() {
                override fun onSuccess(t: List<Something>) {
                }

                override fun onError(e: Throwable) {
                }
            })

getAllSomethings()返回一个 Flowable<List<Something>>

在上述代码中,.subscribeWith() 下划线显示为红色,表示:

Type parameter bound for E in 
fun <E : SingleObserver<in Flowable<List<Something>!>!>!> subscribeWith(observer: E!): E!
is not satisfied: inferred type  ! is not a subtype of SingleObserver<in Flowable<List<Something>!>!>!

我建议你熟悉一下可用的运算符,这会为你节约大量时间。 - akarnokd
好的,我猜你是说我应该使用 single(T defaultItem)?但我不想返回一个 defaultItem。它应该发出一个单一的值或超时并调用 onError。 - Michael Vescovo
继续查看可用的运算符。 - akarnokd
好的我明白了。至少使用firstOrError()似乎可以工作。感谢您的建议!您想回答它还是让我来做?我实际上还记得您之前的帖子,您希望我回答,因为您不在意积分。 - Michael Vescovo
你找到了答案,就发表一个回答。在SO上有很多需要使用非平凡运算符解决并获得积分的问题。 - akarnokd
1
是的,我找到了,但是有你的帮助(而你知道答案)。我觉得有责任问一下,不过我会把这理解为如果你再这样回答,那就是你想要的。再次感谢。 - Michael Vescovo
2个回答

29

好的,感谢@akarnokd的帮助,正如您可以在评论中看到的那样,我找到了答案。

他建议教我如何钓鱼而不是直接给我答案,建议查看这里:http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html (实际上我一开始就应该这么做!)。

在那里,我发现了firstOrError(),它解决了我的问题。

即使我从中调用toSingle()的对象是Flowable,IDE也没有抱怨。 但是查看上面的链接,toSingle()甚至不是一个有效的选项!


2
在我的情况下,我实际上拥有一个Flowable并希望获得它的好处(即背压),但我仍然希望返回一个Single,例如Single>。在我的情况下,我正在使用Android WorkManager的RxWorker,它期望我的函数返回Single,而不是一个Flowable。
在这种情况下,
val flowable = Flowable.just("my flowable")
return flowable.toList() // type: Single<List<String>>

如果你只关心返回特定的值而不关心可流输出,可以这样做:

return flowable.toList().map {} // returns unit
return flowable.toList().map { "Hello" } // returns String
return flowable.toList().map { Result.success() } // returns Result

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接