📜 ⬆️ ⬇️

RxJava. Fighting the challenges of harsh reality

Reactive programming is a very fashionable trend in mobile development at the moment. If we talk about android development, then reactivity is represented mainly by the RxJava library.
The network has more and more articles, training videos, presentations, recordings from conferences that tell about this topic. But the overwhelming majority of the presented material contains theoretical aspects and rather trivial examples in which the developer cannot estimate the real profit from the use of Rx. But one wants to see a real and complex example from life, which very clearly shows all the power, beauty and simplicity of reactive programming.
Therefore, this article will be devoted to a detailed analysis of a real and rather complicated example. And I really hope that after reading, you will truly discover the world of reactive programming.


Little about theory


In the beginning, I would still like to devote time to theory, since when considering an example, you should already more or less clearly understand what Observable, Subscriber, Subscription are, Rx operators and what the diagrams mean for each operator. As I wrote above, there are enough materials now. Therefore, I will provide a list of links to the most important and interesting ones.

The most important resource is the RX wiki.
I would pay particular attention to this point.
It lists all the links to pretty good and high-quality articles.
Personally, I like the article for the introduction .
In my opinion, the author tries to convey to the listener the main idea - you need to think not with objects, but with streams (Stream, not Thread! Multithreading has nothing to do with this). Understanding the whole process of Rx, namely how the interaction of threads, greatly facilitates further work.
Also for the introduction there is a good presentation.
Futurice blog. One of the articles
A blog containing many useful Rx articles and more.
Some of the articles are Part 1 , Part 2 , Part 3 , Part 4 ;
Something already exists in Russian:
1. Translations of articles Grokking RxJava Part 1 , Part 2 , Part 3 , Part 4
2. Independent article
If you use RxJava in your project, then without RetroLambda your further existence does not make sense :)
Good article on lambda
')

And a lot of practice


Well, now consider the real case from our not simple development life.
We needed to get a list of statements (this is a model StatementRUR ) for a specific period of time. Let's say for a month.
What do we have? The request (the statementRURList method) with the offset and limit parameters, as well as the StatementListParameters parameter, in which we set the filter (from such and such date to such and such) and the sorting order. That is, getting a list of statements for the month is already becoming a somewhat non-trivial task in implementation.
Let's simplify a little and imagine that the statementRURList method returns immediately
 List. 
:
int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

.
, UI , , , . , . .
", " . RxJava - , !

, .
RetroFit. , Rx. :
Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
, ResponseApiModel - , .
:
public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
List ( T result ).

! Rx?
.
: 160 , LIMIT = 50



, ( i ).
range . :
Observable.range(0, Integer.MAX_VALUE - 1)
Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
:) , (" ", Stream)

:
Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
- , ? lambda? :
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
:)
Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
. .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
RetroLambda
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

( offset ) . - .
, limit , .
takeUntil , . , observable .
? . .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

. observable "" , ( - ). . toList , "" , , map , .
. .

. RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
, Rx " " , "" scan . toList map ? , , ( ), 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) ...
, , .



. , .

, , - , . , . .
, , . , RX . Rx .

, !
List.
:
int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

.
, UI , , , . , . .
", " . RxJava - , !

, .
RetroFit. , Rx. :
Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
, ResponseApiModel - , .
:
public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
List ( T result ).

! Rx?
.
: 160 , LIMIT = 50



, ( i ).
range . :
Observable.range(0, Integer.MAX_VALUE - 1)
Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
:) , (" ", Stream)

:
Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
- , ? lambda? :
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
:)
Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
. .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
RetroLambda
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

( offset ) . - .
, limit , .
takeUntil , . , observable .
? . .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

. observable "" , ( - ). . toList , "" , , map , .
. .

. RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
, Rx " " , "" scan . toList map ? , , ( ), 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) ...
, , .



. , .

, , - , . , . .
, , . , RX . Rx .

, !
 List. 
:
int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

.
, UI , , , . , . .
", " . RxJava - , !

, .
RetroFit. , Rx. :
Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
, ResponseApiModel - , .
:
public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
List ( T result ).

! Rx?
.
: 160 , LIMIT = 50



, ( i ).
range . :
Observable.range(0, Integer.MAX_VALUE - 1)
Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
:) , (" ", Stream)

:
Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
- , ? lambda? :
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
:)
Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
. .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
RetroLambda
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

( offset ) . - .
, limit , .
takeUntil , . , observable .
? . .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

. observable "" , ( - ). . toList , "" , , map , .
. .

. RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
, Rx " " , "" scan . toList map ? , , ( ), 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) ...
, , .



. , .

, , - , . , . .
, , . , RX . Rx .

, !
List.
:
int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

.
, UI , , , . , . .
", " . RxJava - , !

, .
RetroFit. , Rx. :
Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
, ResponseApiModel - , .
:
public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
List ( T result ).

! Rx?
.
: 160 , LIMIT = 50



, ( i ).
range . :
Observable.range(0, Integer.MAX_VALUE - 1)
Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
:) , (" ", Stream)

:
Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
- , ? lambda? :
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
:)
Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
. .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
RetroLambda
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

( offset ) . - .
, limit , .
takeUntil , . , observable .
? . .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

. observable "" , ( - ). . toList , "" , , map , .
. .

. RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
, Rx " " , "" scan . toList map ? , , ( ), 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) ...
, , .



. , .

, , - , . , . .
, , . , RX . Rx .

, !
 List. 
:
int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

.
, UI , , , . , . .
", " . RxJava - , !

, .
RetroFit. , Rx. :
Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
, ResponseApiModel - , .
:
public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
List ( T result ).

! Rx?
.
: 160 , LIMIT = 50



, ( i ).
range . :
Observable.range(0, Integer.MAX_VALUE - 1)
Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
:) , (" ", Stream)

:
Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
- , ? lambda? :
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
:)
Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
. .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
RetroLambda
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

( offset ) . - .
, limit , .
takeUntil , . , observable .
? . .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

. observable "" , ( - ). . toList , "" , , map , .
. .

. RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
, Rx " " , "" scan . toList map ? , , ( ), 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) ...
, , .



. , .

, , - , . , . .
, , . , RX . Rx .

, !
List.
:
int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

.
, UI , , , . , . .
", " . RxJava - , !

, .
RetroFit. , Rx. :
Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
, ResponseApiModel - , .
:
public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
List ( T result ).

! Rx?
.
: 160 , LIMIT = 50



, ( i ).
range . :
Observable.range(0, Integer.MAX_VALUE - 1)
Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
:) , (" ", Stream)

:
Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
- , ? lambda? :
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
:)
Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
. .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
RetroLambda
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

( offset ) . - .
, limit , .
takeUntil , . , observable .
? . .

:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

. observable "" , ( - ). . toList , "" , , map , .
. .

. RetroLambda:
Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
, Rx " " , "" scan . toList map ? , , ( ), 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) ...
, , .



. , .

, , - , . , . .
, , . , RX . Rx .

, !
  1. List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
  2. List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
  3. List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
     List. 
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !
    List.
    :
    int i = 0; List<StatementRUR> commonList = new ArrayList<>(); while (true) { List<StatementRUR> list = statementRURList(int i * limit, int limit, String accountId, int periodDaysCount, Date docInfoDocDate); commonList.addAll(list); if (list.size() < limit) { break; } i++; }

    .
    , UI , , , . , . .
    ", " . RxJava - , !

    , .
    RetroFit. , Rx. :
    Observable<ResponseApiModel<List<StatementRUR>>> statementRURList (int offset, int limit, String accountId, int periodDaysCount, Date docInfoDocDate);
    , ResponseApiModel - , .
    :
    public class ResponseApiModel<T> { @SerializedName("result") private T result; @SerializedName("errors") private List<ErrorResponseApiModel> errors; @SerializedName("state") private Object state; public ResponseApiModel(T result, List<ErrorResponseApiModel> errors) { this.result = result; this.errors = errors; } public ResponseApiModel(T result, List<ErrorResponseApiModel> errors, Object state) { this.result = result; this.errors = errors; this.state = state; } public ResponseApiModel(List<ErrorResponseApiModel> errors, Object state) { this.errors = errors; this.state = state; } /** * if result == null && errors != null -> throw new ResponseAPIException! * @return result field */ public T getResult() { if (result == null && errors != null) { throw new ResponseAPIException(errors); } return result; } public List<ErrorResponseApiModel> getErrors() { return errors; } public Object getState() { return state; } }
    T result , . errors , T getResult() ResponseAPIException , Subscriber.onError(Throwable e)
    String accountId, int periodDaysCount, Date docInfoDocDate StatementListParameters , .
    List ( T result ).

    ! Rx?
    .
    : 160 , LIMIT = 50



    , ( i ).
    range . :
    Observable.range(0, Integer.MAX_VALUE - 1)
    Observable "" . : 0, 1, 2, 3...Integer.MAX_VALUE - 1 . , - statementRURList . . RetroFit ( ) .
    concatMap . , Observable , Observable , "" . concatMap flatMap , Observable , . , , , Observable .
    :) , (" ", Stream)

    :
    Observable // get All statements from current date for periodDaysCount (with offset, limit) .range(0, Integer.MAX_VALUE - 1) .concatMap(new Func1<Integer, Observable<ResponseApiModel<List<StatementRUR>>>>() { @Override public Observable<ResponseApiModel<List<StatementRUR>>> call(Integer increment) { return statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate); } } );
    - , ? lambda? :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate));
    :)
    Observable "" ResponseApiModel<List>. , , T result ResponseApiModel . result T getResult() . , Observable . map .
    . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(new Func1<ResponseApiModel<List<StatementRUR>>, List<StatementRUR>>() { @Override public List<StatementRUR> call(ResponseApiModel<List<StatementRUR>> listResponseApiModel) { return listResponseApiModel.getResult(); } } );
    RetroLambda
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult);

    ( offset ) . - .
    , limit , .
    takeUntil , . , observable .
    ? . .

    :
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(new Func1<List<StatementRUR>, Boolean>() { @Override public Boolean call(List<StatementRUR> list) { return list.size() < LIMIT; } } );
    RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT);

    . observable "" , ( - ). . toList , "" , , map , .
    . .

    . RetroLambda:
    Observable .range(0, Integer.MAX_VALUE - 1) .concatMap(increment -> statementRURList(LIMIT * increment, LIMIT, accountId, periodDaysCount, docInfoDocDate)) .map(ResponseApiModel::getResult) .takeUntil(list -> list.size() < LIMIT) .toList() .map(this::safeMerge); private <T> List<T> safeMerge(List<List<T>> lists) { List<T> list = new ArrayList<>(); for (List<T> statementOperationRURList : lists) { list.addAll(statementOperationRURList); } return list; }
    , Rx " " , "" scan . toList map ? , , ( ), 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) ...
    , , .



    . , .

    , , - , . , . .
    , , . , RX . Rx .

    , !

Source: https://habr.com/ru/post/267243/


All Articles