反应性扩展:通过起始对象进行拆分

时间:2017-04-18 13:10:28

标签: rx-java reactive-programming

假设我有一个Observable of int:obs = 1 :: 2 :: 3 :: 1 :: 3 :: 1 :: 1 :: 2,我希望从1开始累积系列,如下所示:

acc_obs = 1 + 2 + 3 :: 1 + 3 :: 1 :: 1 + 2 = 6 :: 4 :: 1 :: 3

如何通过反应式扩展来实现这一目标?

我考虑过使用obs.filter(i -> i == 1)并将其与某种buffer(bufferClosingSelector)一起使用,但似乎有两个问题:

  • 它不适用于冷可观察物
  • 如果我bufferClosingSelector"关闭"每次找到1时缓冲区,我的偏移量为1,发出类似1 :: 2 + 3 + 1 :: 3 + 1 :: 1的内容,对吗?

1 个答案:

答案 0 :(得分:0)

我用主题和窗口解决了它,但它看起来不那么好。请看一下:

@Test
public void name() throws Exception {
    //  1 :: 2 :: 3 :: 1 :: 3 :: 1 :: 1 :: 2

    Observable<Integer> just = Observable.fromIterable(Arrays.asList(1, 2, 3, 1, 3, 1, 1, 2)).share();

    Subject<Integer> objectPublishSubject = PublishSubject.<Integer>create().toSerialized();

    just.doOnNext(objectPublishSubject::onNext)
            .window(() -> {
                return objectPublishSubject.takeUntil(integer -> integer == 1).takeLast(1);
            }).flatMap(integerObservable -> integerObservable.reduce((integer, integer2) -> {
        return integer + integer2;
    }).toObservable())
            .test().assertResult(6, 4, 1, 3);
}