Rxjava多个可观察列表

时间:2018-07-31 15:35:09

标签: java rx-java observable

我有两个String的可观察列表。我想使用zip或其他任何操作在rxjava中实现类似的功能。

如果list1有数据而list2没有任何数据-请考虑list1的数据集

如果list1没有数据,而list2有任何数据-请考虑list2的数据集

如果list1和list2都有数据,则取两个list的交点

List1具有0-n个元素,list2具有0-m个元素。

2 个答案:

答案 0 :(得分:0)

使用RxJava尚无官方方法。我建议在其中一个Observable上使用flatMap,然后通过另一个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已经有几个月了,但是这种方法应该可以工作。

答案 1 :(得分:0)

您可以使用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;
});