我不确定我理解repeatUntil。我想要这样的东西:
这是我的测试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"));
答案 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))
;