Paginate Наблюдаемые результаты без рекурсии - RxJava

У меня довольно стандартная проблема разбиения на страницы API, которую вы можете решить с помощью простой рекурсии. Вот сфабрикованный пример:

public Observable<List<Result>> scan() {
    return scanPage(Optional.empty(), ImmutableList.of());
}

private Observable<?> scanPage(Optional<KEY> startKey, List<Result> results) {
    return this.scanner.scan(startKey, LIMIT)
            .flatMap(page -> {
                if (!page.getLastKey().isPresent()) {
                    return Observable.just(results);
                }
                return scanPage(page.getLastKey(), ImmutableList.<Result>builder()
                        .addAll(results)
                        .addAll(page.getResults())
                        .build()
                );
            });
}

Но это, очевидно, может создать массивный стек вызовов. Как я могу сделать это обязательно, но поддерживать наблюдаемый поток?

Вот обязательный пример блокировки:

public List<Result> scan() {
    Optional<String> startKey = Optional.empty();
    final ImmutableList.Builder<Result> results = ImmutableList.builder();

    do {
        final Page page = this.scanner.scan(startKey);
        startKey = page.getLastKey();
        results.addAll(page.getResults());
    } while (startKey.isPresent());

    return results.build();
}

Ответы на вопрос(4)

Ваш ответ на вопрос