kotlin - RxJava:运行可完成列表,直到成功

标签 kotlin rx-java rx-java2

我有一个函数,它接受单个输入并返回Completable。

我想在候选输入列表上顺序运行该函数,直到找到一个完整的Completable且没有错误的函数。

fun doStuff(input: Int): Completable { ... }

Observable.just(1,2,3,4)
          .flatMapCompletable { doStuff(it) }
          .??? // Run completables until one succeeds

我没有使用mergeconcat,因为它们将执行所有Completable。一旦希望成功,我希望它停止执行Completables。

是否有实现此行为的标准操作?

最佳答案

可能的解决方案,但是需要一点RxAcrobatics:

Observable
    .just(1, 2, 3, 4)
    .flatMapSingle { arg ->
        doStuff(arg)
            .toSingle { true }
            .onErrorReturn { false }
    }
    .filter { it }
    .firstElement()
    .subscribe()

如果您控制返回Completable的函数,我建议将其更改为Single<Boolean>,这样您可以更优雅地使用takeUntil,如下所示:
Observable
    .just(1,2, 3, 4)
    .flatMapSingle(::doStuff)
    .takeUntil { it }
    .subscribe()

如果您无法控制返回Completable的函数,则可能仍会创建一个小的包装器:
private fun doStuffWrap(foo: Int) = doStuff(foo)
    .toSingle { true }
    .onErrorReturn { false } 

并使用优雅的解决方案:
Observable
    .just(1, 2, 3, 4)
    .flatMapSingle(::doStuffWrap)
    .takeUntil { it }
    .subscribe()

关于kotlin - RxJava:运行可完成列表,直到成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52794190/

相关文章:

Java/从 Observable<List<String>> 转换为 List<String>

android - 单元测试 : How to verify and mock onCompleted for an Observable in RxJava within Android

java - 如何在 RxJava 中创建可观察对象和观察者?

java - 如何在 Flowable 上执行操作

kotlin - 如何用http4k在中间建模一个路径参数

kotlin - IntelliJ在新的Ktor项目中缺少对slf4j的引用

spring-boot - 如何使用Jackson和java.time解析不同的ISO日期/时间格式?

android - 在 Kotlin 中将字节数组转换为字符串

java - RxJava - 带有 concatWith 和 map 的可观察链

java - 同步定期更新和创建、更新、删除操作