【填坑往事】使用Rxjava2的distinct操作符处理自定义数据类型去重的问题
最近碰到一个问题,自定义数据类型列表中出现了重复数据,需要去重。处理去重的办法很多,比如借助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操作符处理自定义数据类型去重的问题的更多相关文章
- 【填坑往事】Android手机锁屏人脸解锁优化过程实录
背景 写这篇文章,主要是为了以后面试方便.因为我简历上写了,上一份工作的最大亮点是将人脸解锁的速度由1200ms优化到了600ms,所以这些内容已经回答无数遍了.但每次总觉得回答的不完整,或者说总感觉 ...
- [Python3 填坑] 001 格式化符号 & 格式化操作符的辅助指令
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python 格式化符号表 举例说明 (1) %c (2) %s 与 %d (3) %o (4) %x (5) %f (6) %e (7 ...
- 拾遗与填坑《深度探索C++对象模型》3.3节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- Android—基于微信开放平台v3SDK,开发微信支付填坑。
接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...
- css 填坑常用代码分享
以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 因为提交比较麻烦,后来转置github:https://github.com/jsfront/src/blob/mast ...
- 填坑系列:通过ESXi来配置IPMI
近日西安的天气很不错,可是看到从其他地方迁移来的主机在新环境下无法远程调试怪郁闷的,这就需要填坑,要不就会给后来者挖更大的坑. 今天遇到的坑是在IPMI的网络设置里面启用了VLAN标签之后,在新环境下 ...
- Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)
这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angular ...
- 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程
Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
随机推荐
- Mysql的基操
创建一个数据库 (myschool是数据库名) create database myschool; 删除数据库 drop database myschool 创建一个表:(Student是 表名) ...
- Jenkins插件维护
目录 一.简介 二.插件安装 在线安装插件 上传安装插件 从其它jenkins复制插件 配置插件加速器 一.简介 除了在线安装,还可以官网插件下载地址中进行下载安装,如果访问缓慢可以用清华镜像站. 二 ...
- 车载以太网第二弹|测试之实锤 -DoIP测试开发实践
前言 车载以太网测试之实锤系列,之前我们已经从环境设备组成.被测对象组成再到测试过程和测试结果分析,分享了完整的PMA测试 .IOP测试 .TC8中的TCP/IP协议一致性测试 .也分享了1000BA ...
- 记录一次成功CICD完整亲身实践从此踏进入Devops大门
Devops概念 DevOps 强调通过一系列手段来实现既快又稳的工作流程,使每个想法(比如一个新的软件功能,一个功能增强请求或者一个 bug 修复)在从开发到生产环境部署的整个流程中,都能不断地为用 ...
- Sentry 开发者贡献指南 - 前端 React Hooks 与虫洞状态管理模式
系列 Sentry 开发者贡献指南 - 前端(ReactJS生态) Sentry 开发者贡献指南 - 后端服务(Python/Go/Rust/NodeJS) 什么是虫洞状态管理模式? 您可以逃脱的最小 ...
- mysql使用自定义序列实现row_number功能
看了一些文章,终于知道该怎么在 mysql 里面实现 row_number() 排序 话不多说,show you the code: 第一步:建表: create table grades( `nam ...
- re模块计算器作业
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
- c++内存分布之虚函数(多继承)
系列 c++内存分布之虚函数(单一继承) c++内存分布之虚函数(多继承) [本文] 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...
- 【LeetCode】501. Find Mode in Binary Search Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】808. Soup Servings 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/soup-serv ...