5

我有一个清单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?
}
4

3 回答 3

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

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

调用这个函数就可以了:

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

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

于 2018-05-11T14:35:56.300 回答
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) }
}

如果你想发出一个位图列表,你可以像这样使用 single

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) }) 
        }
}
于 2018-05-11T14:08:10.343 回答
1

你有没有尝试过:

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

?

于 2018-05-11T14:33:19.967 回答