在RxJava中使用一个作为谓词组成两个可观察的源

时间:2019-08-22 23:13:53

标签: android rx-java reactive-programming rx-android rx-kotlin

我有2个可观察的源,其中fetchProductList()返回Observable<Datasource>,其他canInvite.execute()取一个值并返回Single<Boolean>。我需要对流进行组合,以将第一个源中的每个发射都馈入第二个源,以一种方式,我可以将fetchProductList()值作为列表返回来自true的所有发射。我试图用这种方式编写它,但是看起来有点笨拙,有没有更好/更简单的方法?

fetchProductList()
                    .map { dataSource -> dataSource.data }
                    .flatMap{ data ->
                        Observable.from(data.roles.map { role ->
                            canInvite.execute(role.key).map { canInvite ->
                                role to canInvite
                            }
                        })
                    }

                    .compose { it -> Single.merge(it) }
                    .filter { it -> it.second == true}
                    .map { it -> it.first }
                    .toList()
                    .subscribe {

1 个答案:

答案 0 :(得分:2)

从我的角度来看,这是一个更清晰的解决方案:

fetchProductList()
    .map { dataSource -> dataSource.data }
    .flatMap { data ->
        Observable.fromIterable(data.roles)
            .flatMapMaybe { role ->
                canInvite.execute(role.key)
                    .flatMapMaybe { result ->
                        if (result) Maybe.just(role) else Maybe.empty()
                    }
            }
    }
    .toList()
    .subscribe { result -> println(result) }