RxJava。 厳しい現実の課題と戦う

リアクティブプログラミングは、現時点でのモバイル開発における非常に流行の傾向です。 Androidの開発について話す場合、反応性は主にRxJavaライブラリによって表されます。
ネットワークには、このトピックについて語る会議の記事、トレーニングビデオ、プレゼンテーション、会議の記録が増えています。 しかし、提示された資料の大部分には、開発者がRxを使用することによる実際の利益を評価できない理論的な側面と非常に些細な例が含まれています。 しかし、あなたは本当に、リアクティブプログラミングのすべてのパワー、美しさ、シンプルさを非常に明確に示す、現実的で複雑な人生の例を見てみたいと思っています。
したがって、この記事では、実際のやや複雑な例の詳細な分析に専念します。 そして、私はこれを読んだ後、あなたがリアクティブプログラミングの世界を本当に発見することを本当に願っています。


理論について少し


例を考えてみると、Observable、Subscriber、Subscription、Rx演算子が何であるか、各演算子の図が何を意味するかについて、すでにある程度明確な考えを持っているはずなので、最初はまだ理論に時間を割いたいと思います。 上で書いたように、今は十分な資料があります。 そのため、最も重要で興味深いものへのリンクのリストを提供します。

最も重要なリソースはRX wikiです
私はこのアイテムに特に注意を払います
かなり良い品質の記事へのすべてのリンクがリストされています。
個人的には、エントリーするのが好きです
私の意見では、著者は主なアイデアをリスナーに伝えようとしています-オブジェクトではなくストリームで考える必要があります(スレッドではなくストリーム!マルチスレッドはこれとは何の関係もありません)。 Rxプロセス全体、つまりフローの相互作用の仕組みを理解することで、さらなる作業が大幅に促進されます。
エントリーするための良いプレゼンテーションもあります
Futuriceブログ 記事の一つ
Rxなどに関する多くの有用な記事を含むブログ
一部の記事は、 パート1パート2パート3パート4チェーンを壊さないください 、RxJavaを使用して複数のソースからデータをロードする
ロシア語には既に何かが存在します:
1. Grokking RxJava パート1パート2パート3パート4の記事の翻訳
2.スタンドアロンの記事
プロジェクトでRxJavaを使用する場合、RetroLambdaがなければ、それ以上存在する意味がありません。
ラムダに関する良い記事

そしてたくさんの練習


さて、今、私たちは単純ではない発達生活からの実際のケースを検討します。
特定の期間のステートメントのリストを取得する必要がありました(これはStatementRURモデルです)。 1か月言います。
何がありますか? offsetおよびlimitパラメーター、 StatementListParametersパラメーターを含む要求( statementRURListメソッド)。ここで、フィルター(日付から日付など)および並べ替え順序を設定します。 つまり、1か月間のステートメントのリストを取得することは、すでに実装においてやや重要なタスクになりつつあります。
少し簡略化して、 statementRURListメソッドがすぐに戻ることを想像してみましょう
 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/J267243/


All Articles