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

RxJava2. Execute a request for every item in a list

我有一个列表 List<FileModel>

FileModel 只是一个 class 包含 id: Int

id - 是我需要获取并转换为位图的照片文件的 ID

我有一个要求:

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

我们可以将此请求returns 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?
}

Observable.fromIterable(list) 应该为列表中的每个项目发出一个事件,这意味着你 return 输入 getPhotos 是 Flowable<Bitmap> 因为 Flowable 可以 return 不止一个值。

我想你真正想要的是:

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

你试过了吗:

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

?

你可以这样做:

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 作为依赖项,你可以从 List 中得到一个 Observable 和一个扩展函数,像这样: myList.toObservable()