如何在可观察流中处理前n个项并保持不同的项

时间:2017-03-16 05:51:52

标签: java rx-java

例如,

给出一定数量(m)的数字流(m1,m2,m3,m4,m5,m6 ......),并对前n项应用变换(2 * i)(n可以更少) ,等于或大于m),对其余项目应用另一个转换(3 * i)。和

返回结果:m1 * 2,m2 * 2,m3 * 3,m4 * 3,m5 * 3,m6 * 3 ...(假设此处n = 2)。

我试图使用take(n)和skip(n)然后concatwith,但看起来take(n)将删除序列中的剩余项目,并在返回之后生成skip(n)。

1 个答案:

答案 0 :(得分:3)

您可以共享m的流,然后将take()skip()流合并回来,如下所示:

    int m = 10;
    int n = 8;
    Observable<Integer> numbersStream = Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
            .publish();

    Observable<Integer> firstNItemsStream = numbersStream.take(n)
            .map(i -> i * 2);

    Observable<Integer> remainingItemsStream = numbersStream.skip(n)
            .map(i -> i * 3);

    Observable.merge(firstNItemsStream, remainingItemsStream)
            .subscribe(integer -> System.out.println("result = " + integer));
    numbersStream.connect();

修改
正如@ A.E所指出的那样。 Daphne,share()将开始与第一个订户一起发射,因此如果Observable已经开始发射项目,则第二个订户可能会错过通知/ s,因此在这种情况下还有其他可能性:
cache() - 将回复所有缓存发出的项目并将其回复给每个新订阅者,但会牺牲取消订阅功能,因此需要谨慎使用。
reply().refCount() - 将Observable创建reply()每个新订阅者的所有先前项目(类似于缓存),但会在最后一个订阅者取消订阅时取消订阅。

在这两种情况下,都应考虑内存,因为Observable会将所有发出的项目缓存在内存中。

publish() - 在不缓存所有先前项目的情况下,使用publish()创建ConnectableObservable并将其称为connect()的其他可能性所有订阅者订阅后开始排放的方法,因此将获得同步,所有订阅者将正确获得所有通知。