我正在使用Kotlin,我有一个Observable<List<FlickPhoto>>
模型。每个FlickrPhoto
都包含一个列表,每个Photos
模型都包含List<Photo>
。
我想将List<FlickrPhoto>
转换为List<PhotoEntity>
,这基本上是另一个数据较少的模型,并将其包装成Observable
(以便最终得到Observable<List<PhotoEntity>>
}})。
我怎样才能以最好的RxJava方式做到这一点?
我已经使用以下方法创建了一个PhotoEntityMapper
类,我确信它可以正确地用于此目的:
override fun transform(photoCollection: List<Photo>): List<PhotoEntity>
提前致谢!
答案 0 :(得分:1)
评论中的解决方案确实有效:
// original
remoteDataSource
.getPhotos(photoTag)
.flatMap({ t: FlickrPhoto ->
Observable
.just(serviceMapper.transform(t.photos.photo)) // <-- not lazy
})
这里有两个不同的选项:
// v1
remoteDataSource
.getPhotos(photoTag)
.flatMap {
Observable
.just(it.photos.photo)
.map { serviceMapper.transform(it) } // <-- lazy transformation
}
// v2
remoteDataSource
.getPhotos(photoTag)
.flatMapIterable { it }
.map { serviceMapper.transform(it.photos.photo) }
没有选择比其他选择好得多。通常我会选择v2
,因为它更短。
但是,我不知道serviceMapper
的作用。例如,如果它涉及网络并且我想在另一个Scheduler
中执行它,则v1
很好,因为您可以在另一个线程中订阅转换(您无法在原始版本中执行转换)版本,因为转换是预先计算的eaguerly)。例如:
// v1 - with scheduler
remoteDataSource
.getPhotos(photoTag)
.flatMap {
Observable
.just(it.photos.photo)
.map { serviceMapper.transform(it) } // <-- lazy transformation
.subscribeOn(Schedulers.io()) // <-- schedule on io()
}