RxJava 序列过滤

RxJava sequence filtering

假设我有两个可观察对象:A 和 B,它们发出项目: 答:1、2、3、4、5 B: 2, 4, 6

有没有办法通过删除也在第二个序列中的项目来过滤第一个序列?

[编辑] 所需数据流:从可观察对象 B (bList) 加载所有项目,然后从 A 加载项目,根据条件过滤它们:!bList.contains(item)

RxJava 提供了一些 filtering operators.

具体来说,您想要 distinct()。如果您想为您的对象定义自己的相等性检查,您可以传递一个检查项目相等性的函数。

请注意,在内部,distinct() 使用 HashSet 跟踪对象,因此如果您的对象没有正确散列(例如,两个 "equal" 对象没有相同的散列码),那么您将需要使用该可选参数来定义您自己的独特性检查。

如果您不合并流,那么您只想使用 filter(),并在您的过滤函数中检查您的 Obeservable 是否已经发出该项目。在这种情况下,您的一个 Observable 必须 在第二个可以被过滤之前完成,因为 RxJava 无法预测未来将发出哪些项目。

例如:

Observable a = Observable.just(1, 2, 3, 4);
Observable b = Observable.just(3, 4, 5, 6);

// If you simply want a list of distinct items:
Observable uniqueItems = a.merge(b).distinct()

// If you just want to filter "a" so it contains none of the items in "b"
Observable filteredA = b.toList().flatMap(itemsInB -> {
    a.filter(item -> !itemsInB.contains(item));
}