RxJava2,repeatUntil和whileDo

时间:2017-11-22 10:05:24

标签: rx-java rx-java2

我不确定我理解repeatUntil。我想要这样的东西:

  1. 创建observable
  2. 检查条件以及它是否真正运行所有下游,否则只需完成
  3. 重复第二点
  4. 这是我的测试Observable,它遇到 IndexOutOfBoundsException

        List<Integer> values = new ArrayList<Integer>();
    
        Observable<Integer> observable = Observable.just(values)
                .repeatUntil(() -> values.isEmpty())
                .map(integers -> values.remove(0));
        observable.subscribe(integer -> System.out.println(integer), 
              throwable -> System.out.println(throwable));
    

    在我看来,repeatUntil将在最后第一次执行。

    我错了吗?如果我是对的,如何在开始时检查条件?

    我也看到,rxJava1中有whileDo-operator。它现在在哪里?

    UPD

    我可以通过在repeatUntil之前使用takeWhile以某种方式解决问题,但也许有更好的解决方案?

        List<Integer> values = new ArrayList<Integer>();
        /*
        values.add(0);
        values.add(1);
        values.add(2);
        values.add(3);
        values.add(4);
        */
    
        Observable<Integer> observable = Observable.just(values)
                .takeWhile(integers -> values.size() > 0)
                .map(integers -> values.remove(0))
                .repeatUntil(() -> values.isEmpty());
        observable.subscribe(integer -> System.out.println("Test " + integer), 
                 throwable -> System.out.println(throwable), 
                 () -> System.out.println("Completed"));
    

1 个答案:

答案 0 :(得分:2)

RepeatUntil在上游完成时调用该函数,即在它发出空ArrayList信号之后,因此你得到异常,因为remove会发现空ArrayList

whileDo运算符位于RxJava 2 Extensions项目中。

List<Integer> values = new ArrayList<Integer>();

StatementFlowable.whileDo(
    Observable.just(values),
    () -> values.isEmpty()
)
.map(integers -> values.remove(0))
.subscribe(integer -> System.out.println(integer), 
      throwable -> System.out.println(throwable))
;