我有一组对象,我想要压制重复的项目。我知道Distinct运算符,但如果我没有弄错,它会通过正确覆盖的哈希码方法来比较项目。但是,如果我的hashcode为相同的对象返回不同的值,并且我想通过我自己设置相等性。 distinct有2个重载方法 - 一个没有params,一个有Func1 param,我想我应该使用第二种方法,但是如何exaclty?
.distinct(new Func1<ActivityManager.RunningServiceInfo, Object>() {
@Override
public Object call(ActivityManager.RunningServiceInfo runningServiceInfo) {
return null;
}
})
答案 0 :(得分:28)
您是对的,您需要在对象上使用一致的equals()
和hashcode()
方法才能使用distinct()
,因为distinct
运算符使用了HashSet
运算符distinct
。
带有Func1
的{{1}}版本允许您将对象转换为您想要区分的内容(但必须实现一致的equals
和hashcode
方法) 。
假设我有一个Observable<Person>
Person
就是这样:
class Person {
String firstName;
String lastName;
}
然后计算我可以做到的不同名字的数量:
persons.distinct(person -> person.firstName).count();
答案 1 :(得分:0)
不确定是否最简单的方法,但你可以用reduce来做。 Reduce采用集合和动作。在操作中,您负责自己将元素添加到集合中。在那里,你可以做任何你喜欢的逻辑,并有条件地将元素添加到集合中。