最近碰到一个问题,自定义数据类型列表中出现了重复数据,需要去重。处理去重的办法很多,比如借助Set集合类,使用双重循环拿每一个元素和其他元素对比等。这里介绍一种简单而且比较优雅的方式:使用Rxjava2中的distinct操作符来实现。

网上介绍这种方式的文章非常多,但基本上都是拿整数类型数据来演示,比如:

1 Observable.just(1, 1, 2, 2, 3, 4).distinct().subscribe(new Consumer<Integer>() {
2 @Override
3 public void accept(Integer integer) throws Exception {
4 Log.d(TAG, "[distinct-accept]integer = " + integer);
5 }
6 });

但实际工作中碰到的数据类型却是自定义类型,看到上述代码后本人还是有时有点手足无措,没法直接拿到依葫芦画瓢。后来自己研究了一下,在上述代码基础上转了一个弯,解决了这个问题,下面记录一下。

使用的自定义类型为:

 1 public class UserInfo {
2 private String userId;
3 private String userName;
4
5 public UserInfo(String userId, String userName) {
6 this.userId = userId;
7 this.userName = userName;
8 }
9
10 public String getUserId() {
11 return userId;
12 }
13
14 public void setUserId(String userId) {
15 this.userId = userId;
16 }
17
18 public String getUserName() {
19 return userName;
20 }
21
22 public void setUserName(String userName) {
23 this.userName = userName;
24 }
25
26 @Override
27 public boolean equals(Object o) {
28 if (this == o) return true;
29 if (o == null || getClass() != o.getClass()) return false;
30 UserInfo userInfo = (UserInfo) o;
31 return Objects.equals(userId, userInfo.userId);
32 }
33
34 @Override
35 public int hashCode() {
36 return Objects.hash(userId);
37 }
38
39 @Override
40 public String toString() {
41 return "UserInfo{" +
42 "userId='" + userId + '\'' +
43 ", userName='" + userName + '\'' +
44 '}';
45 }
46 }

测试代码为

 1 private void testDistinct() {
2 List<UserInfo> userInfoList = new ArrayList<>();
3 userInfoList.add(new UserInfo("id-0", "name-0"));
4 for (int i = 0; i < 10; i++) {
5 userInfoList.add(new UserInfo("id-" + i, "name-" + i));
6 }
7 Log.d(TAG, "[testDistinct]去重前");
8 for (UserInfo userInfo : userInfoList) {
9 Log.d(TAG, "[testDistinct]userInfo = " + userInfo.toString());
10 }
11 Log.d(TAG, "[testDistinct]去重后");
12 Observable.fromIterable(userInfoList).distinct().subscribe(new Consumer<UserInfo>() {
13 @Override
14 public void accept(UserInfo userInfo) throws Exception {
15 Log.d(TAG, "[distinct-accept]userInfo = " + userInfo.toString());
16 }
17 });
18 }

日志

 1 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]去重前
2 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-0', userName='name-0'}
3 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-0', userName='name-0'}
4 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-1', userName='name-1'}
5 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-2', userName='name-2'}
6 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-3', userName='name-3'}
7 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-4', userName='name-4'}
8 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-5', userName='name-5'}
9 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-6', userName='name-6'}
10 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-7', userName='name-7'}
11 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-8', userName='name-8'}
12 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]userInfo = UserInfo{userId='id-9', userName='name-9'}
13 2022-01-08 16:41:31.858 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [testDistinct]去重后
14 2022-01-08 16:41:31.870 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-0', userName='name-0'}
15 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-1', userName='name-1'}
16 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-2', userName='name-2'}
17 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-3', userName='name-3'}
18 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-4', userName='name-4'}
19 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-5', userName='name-5'}
20 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-6', userName='name-6'}
21 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-7', userName='name-7'}
22 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-8', userName='name-8'}
23 2022-01-08 16:41:31.871 12668-12668/com.beantechs.rxjavademo D/rxjava_demo: [distinct-accept]userInfo = UserInfo{userId='id-9', userName='name-9'}

日志中红色部分显示了去重效果。

本示例中是把具有相同userId的对象视为同一个对象,所有在UserInfo类中重写了equals()方法和hashCode()方法,这是关键点。如果判断是否为同一对象的条件有变化,就需要相应地重写equals()方法和hashCode()方法。

【填坑往事】使用Rxjava2的distinct操作符处理自定义数据类型去重的问题的更多相关文章

  1. 【填坑往事】Android手机锁屏人脸解锁优化过程实录

    背景 写这篇文章,主要是为了以后面试方便.因为我简历上写了,上一份工作的最大亮点是将人脸解锁的速度由1200ms优化到了600ms,所以这些内容已经回答无数遍了.但每次总觉得回答的不完整,或者说总感觉 ...

  2. [Python3 填坑] 001 格式化符号 & 格式化操作符的辅助指令

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python 格式化符号表 举例说明 (1) %c (2) %s 与 %d (3) %o (4) %x (5) %f (6) %e (7 ...

  3. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  4. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  5. css 填坑常用代码分享

    以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 因为提交比较麻烦,后来转置github:https://github.com/jsfront/src/blob/mast ...

  6. 填坑系列:通过ESXi来配置IPMI

    近日西安的天气很不错,可是看到从其他地方迁移来的主机在新环境下无法远程调试怪郁闷的,这就需要填坑,要不就会给后来者挖更大的坑. 今天遇到的坑是在IPMI的网络设置里面启用了VLAN标签之后,在新环境下 ...

  7. Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)

    这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angular ...

  8. 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程

    Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...

  9. 【填坑向】spoj COT/bzoj2588 Count on a tree

    这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...

随机推荐

  1. jenkins实例 nodejs项目

    目录 一.案例1 二.案例2 一.案例1 使用shell方式 #清理上一次版本,拉取新代码 rm -rf /server/admin-web cd /server git clone http://g ...

  2. 【划重点】Python matplotlib绘图设置坐标轴的刻度

    一.语法简介 plt.xticks(ticks,labels,rotation=30,fontsize=10,color='red',fontweight='bold',backgroundcolor ...

  3. 有了代码变更分解提交工具SmartCommit,再也不担心复合提交了

    摘要:文将介绍一个代码提交辅助工具SmartCommit,其主要功能是通过杂糅变更分解算法自动生成分组提交方案,接受开发者的反馈和交互式调整,渐进式地引导和辅助开发者做出符合最佳实践的原子提交. 本文 ...

  4. Xpath 使用技巧

    使用xpath 简介 常见语法 选取节点 谓语 通配符 选取多个路径 运算符 其他用法 使用contains选取包含属性 使用tostring()将对象转换为字符串 使用starts-with 使用n ...

  5. [BUUCTF]PWN——[BJDCTF 2nd]ydsneedgirlfriend2

    [BJDCTF 2nd]ydsneedgirlfriend2 附件 步骤: 例行检查,64位程序,开启了canary和nx 试运行一下程序,看看大概的情况,经典的堆块的布局 64位ida载入,习惯性的 ...

  6. [BUUCTF]PWN——铁人三项(第五赛区)_2018_rop

    铁人三项(第五赛区)_2018_rop[32位libc泄露] 题目附件 解题步骤: 例行检查,32位,开启了NX保护 试运行一下程序,一开始让我们输入,然后直接输出"Hellow,world ...

  7. Spring Boot定时任务配置

    import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.a ...

  8. Spring Boot去掉浏览器默认的叶子图标

    在Spring Boot的配置文件application.properites中添加配置项,可以关闭默认的Favicon spring.mvc.favicon.enabled=false

  9. 【LeetCode】1471. 数组中的 k 个最强值 The k Strongest Values in an Array (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 自定义排序 日期 题目地址:https://leetc ...

  10. 【LeetCode】259. 3Sum Smaller 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 双指针 日期 题目地址:https://le ...