RxJava2中如何基于UUID字段而非对象哈希码实现distinct()
解决RxJava基于自定义字段去重的问题
嗨,这个场景我太熟悉了!默认的distinct()方法确实是依赖对象本身的hashCode()和equals()实现来判断唯一性的,所以哪怕两个对象的UUID完全相同,但只要是不同的实例,就会被当成不同的元素保留下来,这就是你看到去掉distinct()结果没变化的原因。
不过RxJava早就为这种场景提供了解决方案——用带键选择器的distinct重载版本:
Observable1.mergeWith(Observable2) .distinct(item -> item.getUuid()) // 传入提取UUID的函数,以此作为去重依据 .map(...) // 后续的订阅逻辑 .subscribe(...);
原理说明
这个重载方法distinct(Function<? super T, ?> keySelector)会根据你传入的函数,从每个发射的对象中提取一个“唯一标识键”(这里就是你的UUID字段),然后基于这个键来判断是否重复:
- 只要两个对象提取出的UUID相同,不管它们是不是同一个实例,都会被视为重复项,只会保留第一个出现的元素
- 如果你的UUID是自定义的
UUID对象而非字符串,只要这个对象正确实现了equals()和hashCode(),这个方法同样能正常工作
这样修改之后,就能精准地基于UUID字段完成去重了,试试看吧!
内容的提问来源于stack exchange,提问作者Alex Kokorin
相关产品推荐
相关产品推荐

