如何过滤 RXJava 中 observable 发出的重复值?

How to filter duplicate values emitted by observable in RXJava?

我有一个对象集合,我想在其中抑制重复项。我知道 Distinct 运算符,但如果我没记错的话,它会通过正确覆盖的哈希码方法来比较项目。但是,如果我的哈希码 returns 相同对象的不同值,并且我想自己设置相等性怎么办。 distinct 有 2 个重载方法 - 一个没有参数,一个有 Func1 参数,我想我应该使用第二种方法,但是有多精确?

    .distinct(new Func1<ActivityManager.RunningServiceInfo, Object>() {
                        @Override
                        public Object call(ActivityManager.RunningServiceInfo runningServiceInfo) {
                            return null;
                        }
                    })

不确定是否是最简单的方法,但您可以使用 reduce 来完成。 Reduce 需要一个集合和一个动作。在操作中,您负责自己将元素添加到集合中。您可以在那里执行任何您喜欢的逻辑,并有条件地将元素添加到集合中。

是的,你是对的,你需要在你的对象上有一致的 equals()hashcode() 方法才能使用 distinct() 因为在幕后 distinct运算符使用 HashSet.

带有 Func1distinct 版本允许您将对象转换成您想要与众不同的东西(但必须实现一致的 equalshashcode方法)。

假设我有一个 Observable<Person>,其中 Person 是这样的:

class Person {
    String firstName;
    String lastName;
}

然后计算不同名字的数量我可以这样做:

persons.distinct(person -> person.firstName).count();