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

时间:2015-08-29 13:04:31

标签: java distinct rx-java

我有一组对象,我想要压制重复的项目。我知道Distinct运算符,但如果我没有弄错,它会通过正确覆盖的哈希码方法来比较项目。但是,如果我的hashcode为相同的对象返回不同的值,并且我想通过我自己设置相等性。 distinct有2个重载方法 - 一个没有params,一个有Func1 param,我想我应该使用第二种方法,但是如何exaclty?

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

2 个答案:

答案 0 :(得分:28)

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

带有Func1的{​​{1}}版本允许您将对象转换为您想要区分的内容(但必须实现一致的equalshashcode方法) 。

假设我有一个Observable<Person> Person就是这样:

class Person {
    String firstName;
    String lastName;
}

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

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

答案 1 :(得分:0)

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