Rxjava множественный наблюдаемый список

У меня есть два наблюдаемых списка String. Я хочу добиться чего-то подобного в rxjava с помощью zip или любой другой операции.

Если у list1 есть данные, а у list2 нет данных - рассмотрите набор данных list1

Если list1 не имеет данных, а list2 имеет какие-либо данные - рассмотрите набор данных list2

Если у list1 и list2 есть данные, возьмите пересечение обоих списков

List1 имеет 0-n элементов, а list2 - 0-m элементов.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
267
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Официального способа сделать это с помощью RxJava нет. Я бы предложил использовать flatMap для одного из Observable, а затем фильтровать каждый элемент через другой Observable. Я не могу это проверить прямо сейчас, но это должно сработать.

Обновлено: что-то вроде:

list1
  .defaultIfEmpty(/*Observable with empty string, for instance (for the empty case)*/)
  .flatMap { element ->
    return list2.defaultIfEmpty(element).filter(x -> x == element);
  }
  .observeOn(...)
  .subscribeOn(...)
  .subscribe(...)

Прошло несколько месяцев с тех пор, как я использовал RxJava, но что-то в этом роде должно работать.

Можете ли вы опубликовать псевдоалгоритм для этого?

himanshu_mps 31.07.2018 18:46

Любое другое решение?

himanshu_mps 01.08.2018 01:35
Ответ принят как подходящий

Вы можете использовать zip, чтобы оба списка были готовы, затем вам нужно выбрать в зависимости от их состояния:

Single<List<Integer>> singleList1 = ...
Single<List<Integer>> singleList2 = ...

Single.zip(singleList1, singleList2, (list1, list2) -> {

    if (list1.isEmpty()) {
        return list2;
    }
    if (list2.isEmpty()) {
        return list1;
    }

    Set<Integer> set = new HashSet<>(list1);
    List<Integer> result = new ArrayList<>(list2.size());

    for (Integer i : list2) {
        if (set.contains(i)) {
            result.add(i);
        }
    }

    return result;
});

Другие вопросы по теме