JAVA 自定义对象集合 List<T> 根据自定义字段去重
1、拥有自定义对象 MyUser
@Data
public class MyUser {
private String userName;
private String passWord;
}
2、编写自定义去重方法实现
/**
* 根据list中对象某些字段去重
* @param list 需要去重的list
* @return 返回去重后的list
*/
private static List<MyUser> removeDuplicateOutputField(List<MyUser> list) {
Set<MyUser> set = new TreeSet<>(new Comparator<MyUser>() {
@Override
public int compare(MyUser myUser, MyUser myUserNew) {
int compareToResult = 1;//==0表示重复
if(StringUtils.equals(myUser.getUserName(), myUserNew.getUserName()) &&
StringUtils.equals(myUser.getPassWord(), myUserNew.getPassWord())) {
compareToResult = 0;
}
return compareToResult;
}
});
set.addAll(list);
return new ArrayList<>(set);
}
注意:其中StringUtils.equals() 传入两个比较对象对应的字段,
比如想要加入userName 字段去重 就要加入 如下条件即可, 想要添加几个字段自行添加即可
StringUtils.equals(myUser.getUserName(), myUserNew.getUserName()) 也可以 使用
myUser.getAge().equals(myUserNew.getAge()) 自行测试决定
3、测试结果
@Test
public void distinctMyUser(){
List<MyUser> list1 = new ArrayList<>();
MyUser user1 = new MyUser();
user1.setUserName("zhangsan");
user1.setPassWord("1234567");
list1.add(user1); MyUser user2 = new MyUser();
user2.setUserName("zhangsan");
user2.setPassWord("123456");
list1.add(user2); MyUser user3 = new MyUser();
user3.setUserName("lisi");
user3.setPassWord("123456");
list1.add(user3); MyUser user4 = new MyUser();
user4.setUserName("lisi");
user4.setPassWord("123456");
list1.add(user4); for (MyUser b: list1) {
System.out.println("去重前:"+b.toString());
} //去重
list1 = removeDuplicateOutputField(list1); for (MyUser b: list1) {
System.out.println("去重后:"+b.toString());
}
}
运行结果如下,达到预期,根据自己想要的字段进行list集合去重操作。

二、List<T> 自定义对象,根据某一列去重,利用lambad 来实现
@Test
public void distinctList() {
AdviceInfo adviceInfo = new AdviceInfo();
adviceInfo.setHospId(8888L);
adviceInfo.setSex("女");
adviceInfo.setAge(22); AdviceInfo adviceInfo2 = new AdviceInfo();
adviceInfo2.setHospId(8888L);
adviceInfo2.setSex("男");
adviceInfo2.setAge(22); ArrayList<AdviceInfo> adviceInfos = Lists.newArrayList();
adviceInfos.add(adviceInfo);
adviceInfos.add(adviceInfo2); adviceInfos.stream().filter(distinctByKey(e -> e.getHospId()))
.collect(Collectors.toList())
.forEach(adviceInfo1 -> System.out.println(adviceInfo1.getSex())); } public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
Map<Object, Boolean> map = new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
运行结果:

JAVA 自定义对象集合 List<T> 根据自定义字段去重的更多相关文章
- Java 中HashTable、HashMap、TreeMap三者区别,以及自定义对象是否相同比较,自定义排序等
/* Map集合:该集合存储键值对.一对一对往里存.而且要保证键的唯一性. Map |--Hashtable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.效率低.基本已废 ...
- .NET/C#中对自定义对象集合进行自定义排序的方法
一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...
- Java ArrayList对象集合去重
import java.util.ArrayList; import java.util.Iterator; public class StringSampleDemo { public static ...
- Java List对象集合按对象属性分组、分组汇总、过滤等操作示例
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Col ...
- jQuery基础(常用插件 表单验证,图片放大镜,自定义对象级,jQuery UI,面板折叠)
1.表单验证插件——validate 该插件自带包含必填.数字.URL在内容的验证规则,即时显示异常信息,此外,还允许自定义验证规则,插件调用方法如下: $(form).validate({o ...
- java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...
- Java基础知识强化之集合框架笔记69:Collections类之ArrayList存储自自定义对象并排序的案例
1. ArrayList存储自自定义对象并排序的案例: ArrayList存储自自定义对象,并使用Collections对ArrayList存储基本包装类的元素排序. 2. 代码实现: (1)Stud ...
- Java基础知识强化之集合框架笔记46:Set集合之TreeSet存储自定义对象并遍历练习2(自然排序:Comparable)
1. TreeSet存储自定义对象并遍历练习2: (1)Student.java package cn.itcast_06; /* * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口 * ...
- Java基础知识强化之集合框架笔记45:Set集合之TreeSet存储自定义对象并遍历练习1(自然排序:Comparable)
1. 自然排序: TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按照升序排列,这种方式就是自然排序. Java中提供了一个Comp ...
随机推荐
- MySQL无法启动:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
1 详细异常 ct 11 17:31:51 bd02.getngo.com mysqld[20513]: 2019-10-11T09:31:51.187848Z 0 [Note] /usr/sbin/ ...
- C和指针--编程题9.14第10小题--判断回文函数
题目: 编写函数 int palindrom( char *string); 如果参数字符串是个回文,函数就返回真,否则就返回假.回文就是指一个字符串从左向右读和从右向左读是一样的.函数应忽略所有的非 ...
- Linux date cal bc和一些快捷键学习
1 date 日期 2 cal 日历 具体每年日历 cal +年份 3 bc 计算器 如果有小数点需要scale命令,scale=数字 quit退出 4 [Tab]按键 :命令补全和档案补 ...
- marquee标签实现跑马灯效果--无缝滚动
今天在做微信端的大转盘抽奖时,想把所有用户的抽奖记录做成无缝滚动的效果,无奈我的js功底太差,一时想不出实现的方法,便百度各种相似效果.但无意中发现了一个html标签——<marquee> ...
- 定时备份etc目录
#!/bin/bash # #******************************************************************** #encoding -*-utf ...
- Unity 连接WebSocket(ws://)服务器
Unity 连接ws,不用任何插件,忙活了一天终于搞定了,一直连接不上,原来是没有添加header, 代码比较简单,直接贴出来普度众生 using System; using System.Net.W ...
- 莫比乌斯函数介绍&&基础
定义 设正整数$N$按照算术基本定理分解质因数为$N=p_1^{c_1}p_2^{c_2} \cdots P_m^{c_m}$,定义函数: $$\mu(N)= \left\{\begin{matrix ...
- BZOJ1101——莫比乌斯函数&&入门
题目 链接 有$50000$次查询,对于给定的整数$a,b$和$d$,有多少正整数对$x$和$y$,满足$x \leq a$,$y \leq b$,并且$gcd(x, y)=d$.$1 \leq k ...
- EasyLogging++学习笔记(1)—— 简要介绍
对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情.通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速.准确地定位问题.在现在这个开 ...
- [转]vue-router各个属性的作用及用法
转自以下网址,当备忘使用:https://www.cnblogs.com/goloving/p/9211358.html vue-router是vue单页面开发的路由,就是决定页面跳转的! <r ...