Создайте отфильтрованное наблюдаемое из 2 наблюдаемых списка элементов в RxJava

Я работаю над функцией, в которой мне нужно отфильтровать данные сетевого ответа на основе данных локальной базы данных.

Например, мои сетевые слои возвращают мне список элементов, а мой уровень базы данных возвращает наблюдаемый список идентификаторов. Теперь я хочу вернуть только те объекты из сетевого уровня, идентификатор которых совпадает с кем-либо из ответа уровня базы данных.

Ниже код извлекает данные из сети и сохраняет результат в базе данных (кэш).

factory.getRemoteDataStore()
                .searchForVenues(query)
                .toObservable()
                .distinctUntilChanged()
                .flatMap { venues ->
                    factory.getCacheDataStore()
                            .saveVenues(venues)
                            .andThen(Observable.just(venues))
                }

У меня также есть метод, который возвращает список мест, которые необходимо отфильтровать.

factory.getCacheDataStore().getDislikedVenues()

Теперь, как мне расширить предыдущую цепочку, чтобы использовать getDislikedVenues() Observable для фильтрации их из ответа сетевого ответа?

Извините за такой нубский вопрос, я действительно борюсь с этим.


person Abhinav Bhadoria    schedule 18.11.2018    source источник


Ответы (1)


Один из способов сделать это

factory.getCacheDataStore().getDislikedVenues()
    .flatMap { dislikedItems -> 
        factory.getRemoteDataStore()
            .searchForVenues(query)
            .toObservable()
            .distinctUntilChanged()
            .flatMapIterable { it }
            .filter { !dislikedItems.contains(it.id) }
            .toList()
            .toObservable()
    }
    .flatMap { venues ->
        factory.getCacheDataStore()
            .saveVenues(venues)
            .andThen(Observable.just(venues))
    }

P.S.: Насколько я понимаю, factory.getRemoteDataStore().searchForVenues(query) возвращает Single или Maybe. В этом случае distinctUntilChanged() не работает, потому что он основан на множественном излучении (onNext()), а Single или Maybe может генерировать только один результат.

person ConstOrVar    schedule 18.11.2018