Другой тип возврата в RxJava 2 (обновление с RxJava1)

Я переношу наше приложение с 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>>. Ты хоть представляешь, как удалить этот сингл? Я не могу изменить возвращаемый тип.


person Tom Wayne    schedule 26.07.2017    source источник


Ответы (1)


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
        }
person Bryan    schedule 26.07.2017
comment
Я обновил код на основе вашего ответа. Проблема все еще сохраняется: /. - person Tom Wayne; 27.07.2017
comment
@ PepaHruška Он по-прежнему возвращает Single? _2 _ и Flowable.map() оба возвращают Flowable, поэтому, если DatabaseRead.permissions() не возвращает Single вместо _7 _... - person Bryan; 31.07.2017