Intereting Posts
Исключение, вызванное: java.lang.ClassNotFoundException: org.reactivestreams.Publisher Как создать пустой конструктор для класса данных в Kotlin Android Метод обмотки React-Kotlin setState Как использовать Spek Расширение Kotlin Android не может разрешить «текст», Не удалось найти или загрузить основной класс при использовании определенного пакета Как исправить подпись обобщенного метода расширения в kotlin для разрешения «Ошибка вывода типа» в kotlin Kotlin: Как запустить функцию с задержкой с помощью функции расширения Параметры и внутренние параметры рефицированного типа изменить класс Kotlin Почему прокрутка ViewPager перед тем, как изменить его заполнение и pagemargin, полностью подвела его? Как использовать делегат injectLazy () из библиотеки Injekt с дженериками? Кнопка выбора кнопки Anko Какова цель Декларации объекта внутри герметичного класса в Котлине? Отправлять данные, полученные из Parse SDK в одном классе приложений, в Activity in android

Преобразование данных с RxJava в Котлине

Я использую 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>

Заранее спасибо!

Решение в вашем комментарии работает:

 // 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 хорошо, потому что вы можете подписаться на преобразования в другом потоке (чего вы не можете сделать в исходной версии, потому что преобразование предварительно вычисляется равномерно) , Пример:

 // v1 - with scheduler remoteDataSource .getPhotos(photoTag) .flatMap { Observable .just(it.photos.photo) .map { serviceMapper.transform(it) } // <-- lazy transformation .subscribeOn(Schedulers.io()) // <-- schedule on io() }