最近碰到一个问题,自定义数据类型列表中出现了重复数据,需要去重。处理去重的办法很多,比如借助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. GSS API

    Detail:http://docs.oracle.com/cd/E24847_01/html/E22200/overview-61.html GSS-API 介绍 使用 GSS-API,程序员在编写 ...

  2. UVA760 DNA Sequencing 题解

    Content 给出两个小写字母组成的字符串,求两个字符串的最长公共子串,如有多个按字典序顺序输出,如没有输出 No common sequence.,每两组数据间输出一个空行,最后一组数据后不应输出 ...

  3. SPQuery ViewAttributes Sharepoint列表查询范围

    SPSite site=new SPSite(SPContext.Current.Web.Url); SPWeb web=site.OpenWeb(); SPList splist=web.Lists ...

  4. WinFrm中多线程操作窗体属性

    首先声明一个委托. delegate void SetTextCallback(string text); 然后再写一个事件. private void SetInfo(string text) { ...

  5. js控制滚动条在最底部位置

    window.scrollTo(0, document.body.scrollHeight) 如果需要始终保持在最底部,可以循环调用该方法 如果是div的 /*滚动条到地步*/ function to ...

  6. c++设计模式概述之命令

    代码写的不够规范,目的是为了缩短文章篇幅,实际中请不要这样做.  1.概述 命令模式是一种数据驱动的模式.将请求封装到命令的对象中,再传给调用对象,调用对象再处理该命令. [将一个请求封装为一个对象] ...

  7. 【LeetCode】929. Unique Email Addresses 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 set + 字符串操作 参考资料 日期 题目地址:h ...

  8. 【LeetCode】486. Predict the Winner 解题报告(Python)

    [LeetCode]486. Predict the Winner 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: ht ...

  9. 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)

    [剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...

  10. Codeforces Gym-100985C: MaratonIME plays Nim(交互题&博弈)

    C. MaratonIME plays Nim time limit per test : 2.0 smemory limit per test : 64 MBinputstandard inputo ...