Rxjava2根据条件将流分成2个流

时间:2018-01-22 14:48:01

标签: rx-java rx-java2

我对rxjava2比较陌生,并且正在撼动摇滚乐。 我的问题是能够根据条件将一个流分成两个流然后连接它们。

实施例: 我有一个网络请求(Retrofit)返回 Single 。 此对象MyResponse包含由

获取/执行的过程列表
.map(MyResponse::getProcedures)
.flatmap(Observable::fromIterable)
.flatmap(Procedure::execute)

这一部分正在运行从JSON创建的每个过程都被正确调用和执行,但是,其中一些过程具有依赖性,例如:1个过程在服务器上传文件,另一个禁用Wifi。 需要在其他程序之后发生Wifi禁用,否则会阻止上传执行。

我一直在玩RxJS Marbles找到合适的操作符,但它们都适用于1或2流到1。 在我的情况下,它应该是1到2。

1 - 解决方案是在集合上调用排序方法以对它们进行正确排序,然后通常执行它们。

2 - 有没有办法将特定条件的流分成2个不同的流(网络操作/硬件操作无论如何)?实现这样的目标:

.split(Procedure::hasPriority) // return true/false
.concat(splitTrue, splitFalse)
then execute them

由于

@Lukasz 谢谢,我用简化的案例测试了你的命题:

        Observable.just(1, 2, 3, 4, 5, 6)
            .publish(f ->
                    Observable.concat(
                        f.filter(this::isEven).map(this::printEven),
                        f.filter(this::isOdd).map(this::printOdd)
                    )
            ).subscribe();

它打印: 2是偶数,4是偶数,6是偶数,1是奇数,3是奇数,5是奇数,这是预期的行为。

在我的情况下,基于简单标志的顺序排序将是基本的,导致每个过程将独立于另一个进行评估。 我将对整个列表进行重新排序,并在考虑到程序之间的依赖性的情况下实施一些内容。

与此同时,回到书本,rx对新手来说不是那么友好。再次感谢

1 个答案:

答案 0 :(得分:0)

我认为这可以使用带有函数的发布运算符的版本来完成。它的作用是,它允许您根据需要多次订阅上游可观察对象,并对其执行不同的操作,只要您最终从该函数返回单个observable。

所以我认为在你的情况下你会做类似

的事情
.map(MyResponse::getProcedures)
.flatmap(Observable::fromIterable)
.publish(shared -> {
  Observable.concat(
    shared.filter(Prodedure::hasPriority).flatMap(Procedure::execute),
    shared.filter(!Procedrue::hasPriority).flatMap(Procedure::execute)
  )
})

希望这有帮助