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));
}
假设我有两个可观察对象: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));
}