【问题标题】:Reactive extensions: splitting by starting object反应式扩展:按起始对象拆分
【发布时间】:2017-04-18 22:11:22
【问题描述】:

假设我有一个整数的 Observable: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) 一起使用,但它似乎有两个问题:

  • 它不适用于冷的 observables
  • 如果我的bufferClosingSelector 每次找到1 时都会“关闭”缓冲区,我的偏移量将为1 并发出类似1 :: 2 + 3 + 1 :: 3 + 1 :: 1 的内容,对吧?

【问题讨论】:

    标签: rx-java reactive-programming


    【解决方案1】:

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

    @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);
    }
    

    【讨论】:

    • 所以,Subject 是使用相同的 observable 两次的技巧,对吧?这是多少黑客? :D
    • 嗯,允许在doOnNext中使用一个主题来存储状态。我不知道它在您的系统中的可集成性有多好,因为它是有状态的。如果它适合你,就试试吧。
    • 好的,我去看看!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2011-08-27
    • 2012-01-15
    相关资源
    最近更新 更多