将有条件的循环转换为RxJava流

x2b*_*ool 2 android rx-java rx-kotlin rx-java2 rx-kotlin2

我有一些代码会阻止while循环中的操作(从服务器下载一些数据)。客户不知道每个步骤要退回多少物品。下载N个项目时循环中断。

val n = 10
val list = ArrayList<T>()

while (list.size < n) {
    val lastItemId = list.last()?.id ?: 0
    val items = downloadItems(lastItemId)
    list.addAll(items)
}
Run Code Online (Sandbox Code Playgroud)

downloadItems执行阻止的HTTP调用并返回列表。现在,假设downloadItems更改,新的返回类型为Observable<Item>。我如何在不执行类似操作的情况下更改代码以使用RxJava blockingGet

Ana*_*lii 5

您可以repeatUntil用来实现以下目的:

var totalItems = 0    
var id = 0
Observable.fromCallable {
            downloadItems(id)
        }
        .flatMap {
            list ->
                totalItems += list.size
                id = list.last()?.id ?: 0
                Observable.just(list)
        }
        .repeatUntil({totalItems > n})
        .subscribe({result -> System.out.println(result) })
Run Code Online (Sandbox Code Playgroud)