如何在RXJava中过滤可观察发出的重复值?

2022-09-02 12:28:31

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

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

答案 1

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

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

假设我有一个像这样的地方:Observable<Person>Person

class Person {
    String firstName;
    String lastName;
}

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

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

答案 2

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


推荐