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

时间:2018-05-11 13:36:23

标签: android kotlin rx-java2 rx-android rx-kotlin

我有一个列表List<FileModel>

FileModel只是一个包含id: Int

的类

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

我有一个请求:

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

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

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?
}

1 个答案:

答案 0 :(得分:1)

Observable.fromIterable(list)应为列表中的每个项目发出一个事件,这意味着您在getPhotos中返回的类型为Flowable<Bitmap>,因为Flowable可以返回多个值。

我认为你真正想要的是:

fun getPhotos(list: List<FileModel>): Flowable<Bitmap> {
    return Observable.fromIterable(list)
        .map { getFile(it.id) }
        .map { generatePhoto(it) }
}

如果要发出位图列表,可以像这样使用单个

fun getPhotos(list: List<FileModel>): Single<List<Bitmap>> {
    return Single.just(list)
        .map { it.map { getFile(it.id) } }
        .flatMap { 
            Single.just(it.map { generatePhoto(it) }) 
        }
}