可观察:如果发射的物品少于X,则切换

时间:2017-12-12 22:46:22

标签: mongodb rx-java rx-scala

我有一个可观察的名单obs1,obs2,obs3,...,

每个人都可以发出一些项目(来自mongodb数据库),我只对前N个项目感兴趣。我想确保只在需要时执行我的observable的查询。换句话说,例如,如果obs1产生的数量超过N,那么obs2后面的查询就不会运行等等。

如果我使用concat:Observable(obs1,obs2,obs3,...)。concat,所有查询都可以在mongodb中并行运行

基本上,我正在寻找像obs1.switchIfX(obs2).switchIfX(obs3).....

这样的操作

其中X:当前可观察的物品发射的物品少于N个。

知道如何以rxscala风格实现此要求吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情(未经测试):

Observable.just(obs1, obs2, obs3).flatten(maxConcurrent=1).take(N)

maxConcurrent参数确保flatten一次仅订阅一个observable,并且一旦发出N项,take将取消订阅上游可观察对象,因此,如果此时尚未订阅obs2obs3,则根据需要永远不会运行它们。

答案 1 :(得分:0)

您可以将来自源的项目收集到列表中,在Console.WriteLine(s[1]); 运算符中检查其大小,如果长度不够,则切换到另一个源:

flatMap

如果您不想获得超过N个项目,则可以指定@Test public void test() { Observable.range(1, 5) .compose(switchIfFewer(Observable.range(1, 8), 10)) .compose(switchIfFewer(Observable.range(1, 15), 10)) .test() .assertResult(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); } static <T> ObservableTransformer<T, T> switchIfFewer(Observable<T> other, int n) { return o -> { return o.toList() .flatMapObservable(list -> { if (list.size() < n) { return other; } return Observable.fromIterable(list); }); }; }