RxJava。加入两个Observable / Flowable流中的所有项目

时间:2017-09-24 11:08:44

标签: rx-java reactive-programming

我正在加载一些要在单个网页上显示的项目。与此同时,我正在加载物品的价格。简化它看起来像这样:

Observable<Integer> ids =  itemIdsToShow(); // COLD Observable
Observable<Item> items = ids.flatMap(id -> loadingItem(id));
Observable<Price> prices = ids.flatMap(id -> loadingPrice(id));

更新:“商品”和“价格”均未订购。

现在我想和他们一起加入。

Observable<Long> wait = Observable.interval(1000, TimeUnit.SECONDS);
Observable<Pair<Item, Price>> pairs = items.join(prices, (ii)->wait, (pp)->wait, Pair::of);

Observable<Item2> items2 = pairs.filter(p->p.a.id == p.b.id).map(p->new Item2(p.a, p.b));

它有效,但Observable“等待”看起来很奇怪。或者,我可以使用任何永远不会完成的Observable。实际上我需要一个可观察的,当“物品”和“价格”都完成时就完成了。

下一个建议不起作用。

Observable<Object> wait = items.mergeWith(prices).takeLast(1);

方法“join”再次订阅这个新创建的Observable,它启动新一代ID序列(一切从头开始)。

我很确定,在没有创建自定义实现的情况下,可以使用干净且美观的方式进行完全连接。

1 个答案:

答案 0 :(得分:0)

Zip operator就是这样做的。对于您的示例,您最终得到的结果如下:

Observable.zip(Item, Price, Pair<Item, Price>)(items, prices, 
BiFunction { item, price ->
    Pair(item, price)
})

您可以在here中更详细地看到此示例。

修改:根据更新后的问题,由于flatMap没有保留订单,因此无法对其进行排序。而是结帐concatMap,其中包含(direct link to the marble diagram)。