RxJava序列过滤

时间:2015-08-11 16:41:35

标签: android rx-java rx-android

假设我有两个可观察物:A和B发射物品: 答:1,2,3,4,5 B:2,4,6

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

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

1 个答案:

答案 0 :(得分:5)

RxJava提供了许多filtering operators

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

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

如果您没有组合流,那么您只想使用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));
}