У меня есть два наблюдаемых списка String. Я хочу добиться чего-то подобного в rxjava с помощью zip или любой другой операции.
Если у list1 есть данные, а у list2 нет данных - рассмотрите набор данных list1
Если list1 не имеет данных, а list2 имеет какие-либо данные - рассмотрите набор данных list2
Если у list1 и list2 есть данные, возьмите пересечение обоих списков
List1 имеет 0-n элементов, а list2 - 0-m элементов.




Официального способа сделать это с помощью 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, но что-то в этом роде должно работать.
Любое другое решение?
Вы можете использовать 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;
});
Можете ли вы опубликовать псевдоалгоритм для этого?