Составление двух наблюдаемых источников с использованием одного в качестве предиката в RxJava

У меня есть 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 {

person Sushant    schedule 22.08.2019    source источник


Ответы (1)


С моей точки зрения, это немного более четкое решение:

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) }
person Andrei Tanana    schedule 27.08.2019