如何过滤 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
.
带有 Func1
的 distinct
版本允许您将对象转换成您想要与众不同的东西(但必须实现一致的 equals
和 hashcode
方法)。
假设我有一个 Observable<Person>
,其中 Person
是这样的:
class Person {
String firstName;
String lastName;
}
然后计算不同名字的数量我可以这样做:
persons.distinct(person -> person.firstName).count();
我有一个对象集合,我想在其中抑制重复项。我知道 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
.
带有 Func1
的 distinct
版本允许您将对象转换成您想要与众不同的东西(但必须实现一致的 equals
和 hashcode
方法)。
假设我有一个 Observable<Person>
,其中 Person
是这样的:
class Person {
String firstName;
String lastName;
}
然后计算不同名字的数量我可以这样做:
persons.distinct(person -> person.firstName).count();