假设我有两个可观察物:A和B发射物品: 答:1,2,3,4,5 B:2,4,6
有没有办法通过删除也是第二序列的项来过滤第一个序列?
[编辑] 必需的数据流:从可观察的B(bList)加载所有项目,然后从A加载项目,根据标准过滤它们:!bList.contains(item)
答案 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));
}