Я переношу наше приложение с RxJava 1.x.x на RxJava 2.x.x. У меня проблема с одним из моих методов - он возвращает другой тип возвращаемого значения. У меня в версии 1.x.x был такой метод:
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 не допускаются наблюдаемые значения NULL. Я решил эту проблему с помощью Optional. Я также заменил классы Observable на Flowable, потому что мне нужно управлять стратегией 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>>
. Ты хоть представляешь, как удалить этот сингл? Я не могу изменить возвращаемый тип.