在Kotlin中使用RxJava进行数据转换

时间:2017-11-21 18:59:56

标签: android kotlin rx-java

我正在使用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>

提前致谢!

1 个答案:

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