将带条件的循环转换为 RxJava 流
Converting loop with condition into RxJava stream
我有代码在 while 循环中执行阻塞操作(从服务器下载一些数据)。客户不知道每一步要 return 编辑多少项目。下载 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)
}
downloadItems
执行阻止 HTTP 调用和 returns 列表。现在让我们假设 downloadItems
更改并且新的 return 类型是 Observable<Item>
。我如何更改代码以使用 RxJava 而不执行 blockingGet
?
您可以使用 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) })
我认为这是一种优雅的方式
int n = 10;
Observable.range(0,n)
.flatMap(i -> downloadItems(i))
.toList()
.subscribe(itemsList -> itemsList.forEach(item -> System.out.println(item)));
我有代码在 while 循环中执行阻塞操作(从服务器下载一些数据)。客户不知道每一步要 return 编辑多少项目。下载 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)
}
downloadItems
执行阻止 HTTP 调用和 returns 列表。现在让我们假设 downloadItems
更改并且新的 return 类型是 Observable<Item>
。我如何更改代码以使用 RxJava 而不执行 blockingGet
?
您可以使用 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) })
我认为这是一种优雅的方式
int n = 10;
Observable.range(0,n)
.flatMap(i -> downloadItems(i))
.toList()
.subscribe(itemsList -> itemsList.forEach(item -> System.out.println(item)));