RxJava2。对列表中的每个项目执行请求

xsk*_*kit 5 android kotlin rx-android rx-kotlin rx-java2

我有一个清单 List<FileModel>

FileModel 只是一个类包含 id: Int

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

我有个请求:

fun getFile(fileId: Int): Single<ResponseBody>
Run Code Online (Sandbox Code Playgroud)

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

fun generatePhoto(responseBody: ResponseBody): Single<Bitmap?>
Run Code Online (Sandbox Code Playgroud)

我想要的是创建一个函数

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

Rod*_*ito 6

你可以这样做:

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()
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以根据flapMapping需要遍历列表,然后最后将其重新组合为一个列表。该toList()运营商仅仅是一个方便的是放在一起的项目之前发出。

并调用此函数只需:

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

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