RxJava 2中的不同返回类型(从RxJava1更新)

时间:2017-07-26 17:15:52

标签: android kotlin rx-java rx-java2

我正在将我们的应用程序从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中,不允许使用可空的可观察对象。我用Optional解决了这个问题。我还用Flowable替换了Observable类,因为我需要管理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>>。你知道如何删除那个单身吗?我无法更改返回类型。

1 个答案:

答案 0 :(得分:0)

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
        }