【问题标题】:RxJava sequence filteringRxJava 序列过滤
【发布时间】:2015-08-12 01:30:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

    RxJava 提供了多个filtering operators

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

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

    如果您没有合并流,那么您只想使用filter(),并在您的过滤函数中检查您的 Observable 是否已经发出了该项目。在这种情况下,您的 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));
    }
    

    【讨论】:

    • 是的,你已经解释了最后一段。我正在寻找一个干净的解决方案来做到这一点。
    • 我添加了一个示例,演示如何使用filter() 来实现您想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多