Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Те, кто уже с Rx «не на Вы» могут возразить мне, что для аккумулирования «выпущенных» элементов существует специальный оператор scan.
Зачем же городить огород из toList и map? Дело в том, что, если первый же запрос вернет нам пустой список (и тогда этот запрос будет единственным), scan выдаст ошибку
List<String> empty = new ArrayList<String>();
Observable.just(empty).scan((accum, nextList) -> {
accum.addAll(nextList);
return accum;
}).subscribe(list -> {
System.out.println("Should be empty list: " + list.size());
});
Я потратил немало сил и времени, чтобы написать такой простой с виду код.
Future<List<StatementRUR>> future = executor.submit(
(Callable<List<StatementRUR>>) () -> {
int i = 0;
List<StatementRUR> commonList = new ArrayList<>();
while (true) {
// Retrofit должен иметь простой сихронный доступ
List<StatementRUR> list =
statementRURList(int i * limit, int limit, String accountId,
int periodDaysCount, Date docInfoDocDate);
commonList.addAll(list);
if (list.size() < limit) {
break;
}
i++;
}
return commonList;
}
);
Но тут встает вопрос, что по циклу вы вот так запросы не сможете посылать. RetroFit ругнется и выкинет нас.
Each Call from the created GitHubService can make a synchronous or asynchronous HTTP request to the remote webserver.
Call
.concatMap
подставите flatMap
, но это несколько другая история.reduce, scan
. java.util.NoSuchElementException: Sequence contains no elements
at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:131)
at rx.internal.operators.OperatorTakeLastOne$ParentSubscriber.onCompleted(OperatorTakeLastOne.java:106)
at rx.internal.operators.OperatorScan$2.onCompleted(OperatorScan.java:123)
at rx.observers.SerializedObserver.onCompleted(SerializedObserver.java:99)
at rx.observers.SerializedSubscriber.onCompleted(SerializedSubscriber.java:65)
at rx.internal.operators.OperatorConcat$ConcatSubscriber.subscribeNext(OperatorConcat.java:171)
at rx.internal.operators.OperatorConcat$ConcatSubscriber.onCompleted(OperatorConcat.java:154)
at rx.internal.operators.OperatorMap$1.onCompleted(OperatorMap.java:44)
at rx.observers.SerializedObserver.onCompleted(SerializedObserver.java:99)
at rx.observers.SerializedSubscriber.onCompleted(SerializedSubscriber.java:65)
at rx.internal.operators.OperatorConcat$ConcatSubscriber.subscribeNext(OperatorConcat.java:171)
at rx.internal.operators.OperatorConcat$ConcatSubscriber.onCompleted(OperatorConcat.java:154)
at rx.internal.operators.OperatorMap$1.onCompleted(OperatorMap.java:44)
at rx.internal.operators.OperatorMap$1.onCompleted(OperatorMap.java:44)
at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:125)
at rx.internal.operators.OperatorTakeLastOne$ParentSubscriber.emit(OperatorTakeLastOne.java:158)
at rx.internal.operators.OperatorTakeLastOne$ParentSubscriber.onCompleted(OperatorTakeLastOne.java:124)
at rx.internal.operators.OperatorScan$2.onCompleted(OperatorScan.java:123)
at rx.internal.operators.OperatorTakeUntilPredicate$ParentSubscriber.onNext(OperatorTakeUntilPredicate.java:57)
at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:55)
at rx.observers.SerializedObserver.onNext(SerializedObserver.java:159)
at rx.observers.SerializedSubscriber.onNext(SerializedSubscriber.java:95)
at rx.internal.operators.OperatorConcat$ConcatInnerSubscriber.onNext(OperatorConcat.java:206)
at retrofit.RxSupport$2.run(RxSupport.java:56)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
toList
и map
RxJava. Борьба с вызовами суровой действительности