如何使用RxJava2将不同的异步源聚合为Single?

时间:2017-11-08 10:28:16

标签: java asynchronous rx-java2

我们说我有这种同步方法:

public FruitBowl getFruitBowl() {
    Apple apple = getApple(); // IO intensive
    Banana banana = getBanana(); // CPU intensive
    return new FruitBowl(apple, banana);
}

我可以使用Java并发API将其转换为异步方法,这有点像这样:

public Future<FruitBowl> getFruitBowl() {
    Future<Apple> appleFuture = getAppleAsync(); // IO intensive
    Future<Banana> bananaFuture = getBananaAsync(); // CPU intensive
    return createFruitBowlAsync(appleFuture, bananaFuture); // Awaits appleFuture and bananaFuture and then returns a new FruitBowl
}

在利用它的调度程序(io和计算)并返回Single时,这种惯用的Rx方式是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用zip运算符。并为每个异步操作定义一个不同的线程。如果你不这样做,这些方法将在同一个线程上一个接一个地执行。

我会为这两种方法创建Observable版本,以便分别返回Observable<Apple>Observable<Banana>并以这种方式使用它们:

Observalbe.zip(getAppleObservable().subscribeOn(Schedulers.newThread()), 
               getBananaObservable().subscribeOn(Schedulers.newThread()),
     (apple, banana) -> new FruitBowl(apple, banana)))
     .subscribe(/* do your work here with FruitBowl object */);

Here有关如何使用zip运算符

并行化操作的更多详细信息