首页 > 解决方案 > RxJava2。对列表中的每个项目执行请求

问题描述

我有一个清单List<FileModel>

FileModel只是一个类包含id: Int

id- 是我需要获取并投射到位图的照片文件的 ID

我有个请求:

fun getFile(fileId: Int): Single<ResponseBody>

此请求返回ResponseBody我们可以转换为 Bitmap

fun generatePhoto(responseBody: ResponseBody): Single<Bitmap?>

我想要的是创建一个函数

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    // Execute getFile(...) for each item in the list
    // Cast getFile(...) result to Bitmap using generatePhoto(...)
    // Return a list of Bitmaps
}

我已经尝试过这样的事情,但这是完全错误的

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    return Observable.fromIterable(list)
        .flatMap { getFile(it.id) }
        // How to call generatePhoto(...) here?
}

标签: androidkotlinrx-java2rx-androidrx-kotlin

解决方案


你可以这样做:

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    // Get an Observable of the list
    return Observable.fromIterable(list)
        // Get a Single<ResponseBody> for every FileModel
        .flatMapSingle { getFile(it.id) }
        // Get a Single<Bitmap> for every ResponseBody
        .flatMapSingle { file -> generatePhoto(file) }
        // Put everything back on a list
        .toList()
}

这样,您可以根据需要遍历列表flapMapping,然后最后将其重新组合为列表。运算符只是将toList()之前发出的项目放在一起的便利。

调用这个函数就可以了:

    getPhotos(list)
        .doOnSuccess { resultList ->
          Log.d("Rx", "doOnSuccess.resultList=[$resultList]")
        }
        .subscribe()

顺便说一句,如果你有RxKotlin一个依赖项,你可以ObservableList带有扩展函数的 a 中获取一个,如下所示: myList.toObservable()


推荐阅读