You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:11:00