Intereting Posts
Весенняя загрузка с одностраничным приложением на AWS Elastic Beanstalk требует дополнительной перенаправления Встроенная функция не может получить доступ к непубличным API: @PublishedApi vs @Suppress vs @JvmSynthetic Котлинский эквивалент «экспортного дефолта» в JavaScript Плагин с id `kotlin` не найден Kotlin – Проверьте, является ли общий параметр необязательным или нет? разница между забавой в компаньонном блоке объекта и вне класса в котлине? Android: получение IllegalAccessError только на встроенных APK Перевести с Java на Kotlin OnClickListener Что эквивалентно статическим методам Java в Котлине? Попытка мигрировать на канарейку 5 Свойство, которое изменяет a от var до val, когда ни одно значение null не назначено? Ошибка сообщения IntelliJ об ошибке для файла, не найденного в модуле, который я создал В TornadoFX, как я могу привязать свойства BigDecimal к другому свойству BigDecimal с помощью objectBinding? Разработка приложений для Android с помощью java и kotlin Какая из сопрограмм (goroutines и kotlin сопрограммы) быстрее?

Различный тип возврата в RxJava 2 (обновление от RxJava1)

Я переношу наше приложение из RxJava 1.xx в RxJava 2.xx У меня проблема с одним из моих методов – он возвращает другой тип возврата. У меня был этот метод в версии 1.xx:

fun permissionsUsers(groupId: String): Observable<PermissionsUsers?> { return DatabaseRead.permissions(groupId) .flatMap { Observable.from(it).map { combineLatest(DatabaseRead.user(it.getId()), Observable.just(it.level), ::UserLevel) }.toList() } .flatMap { Observable.combineLatest(it) { var owner: User? = null val editPermissions = mutableListOf<User>() val readOnlyPermissions = mutableListOf<User>() it.forEach { it as UserLevel when (it.level) { Permission.LEVEL_OWNER -> owner = it.user Permission.LEVEL_WRITE -> editPermissions.add(it.user) Permission.LEVEL_READONLY -> readOnlyPermissions.add(it.user) } } PermissionsUsers(checkNotNull(owner, { "Owner doesn't exist" }), editPermissions.sortedBy(User::name), readOnlyPermissions.sortedBy(User::name)) } } } 

Как видите, тип результата – Observable<PermissionsUsers?> . В RxJava2 недопустимые наблюдаемые значения не допускаются. Я решил эту проблему с опцией. Я также заменил классы Observable Flowable cause. Мне нужно управлять стратегией Backpressure. Это означает, что тип возврата изменяется с Observable<PermissionsUsers?> Flowable<Optional<PermissionUsers>> . Это измененный метод:

 fun permissionsUsers(groupId: String): Flowable<Optional<PermissionsUsers>> { return DatabaseRead.permissions(groupId) .flatMap { Flowable.fromIterable(it.toSome()).map { combineLatest(DatabaseRead.user(it.getId()), Flowable.just(it.level.toOptional()), ::UserLevel) }.toList() } .map { Flowable.combineLatest(it) { var owner: User? = null val editPermissions = mutableListOf<User>() val readOnlyPermissions = mutableListOf<User>() it.forEach { it as UserLevel when (it.level) { Permission.LEVEL_OWNER -> owner = it.user Permission.LEVEL_WRITE -> editPermissions.add(it.user) Permission.LEVEL_READONLY -> readOnlyPermissions.add(it.user) } } PermissionsUsers(checkNotNull(owner, { "Owner doesn't exist" }), editPermissions.sortedBy(User::name), readOnlyPermissions.sortedBy(User::name)).toOptional() } } } 

Проблема в том, что теперь требуемый тип возвращаемого значения завернут в дополнительный Single. Таким образом, он выглядит следующим образом: Single<Flowable<Optional<PermissionsUsers>>>
вместо Flowable<Optional<PermissionsUsers>> . Вы не знаете, как удалить этот сингл? Я не могу изменить тип возврата.

toList() (который возвращает Single ) находится в неправильном месте.

Измените это:

 return DatabaseRead.permissions(groupId) .flatMap { Flowable.fromIterable(it.toSome()).map { // Map code } } .toList() .map { // Map code } 

К этому:

 return DatabaseRead.permissions(groupId) .flatMap { Flowable.fromIterable(it.toSome()).map { // Map code }.toList() }.map { // Map code }