Различный тип возврата в 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 }