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 ...
随机推荐
- touchgfx MVP
- 多线程模块的condition对象
Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方 ...
- 013.子查询和分页子查询(sql实例)
--1 子查询 如果子查询和表连接都实现的时候,推荐用表连接实现( 一般:能用表连接实现的就用表连接,有些情况用表连接不能 或者不易实现的再选择子查询) 系统:缓存,执行计划技术手段 --1 wher ...
- Files的常用方法都有哪些?(未完成)
Files的常用方法都有哪些?(未完成)
- 牛客练习赛51 C 勾股定理 (数学,结论)
链接:https://ac.nowcoder.com/acm/contest/1083/C来源:牛客网 题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角 ...
- CSS基础学习 17.CSS动画
- scala-currying化
scala的加里化(currying)纠结了很久.通过Scala Worksheet 可以打印很多调试信息,所以用它写了一些测试代码,帮助自己理解. object test { //一个参数列表,3个 ...
- 关于datagridview控件如何动态改变行数问题
首先要把单元格转换成txt文本框然后根据TextChanged事件来进行修改就可以实现 private void Return_DGV_EditingControlShowing(object sen ...
- Qt QMutexLocker_自动解锁的机制
QMutexLocker 是一个便利类,它可以自动对QMutex加锁与解锁.因为QMutexLocker 申请的这个lock变量在这个函数退出时,自动的调用析构函数来解锁.这样可以防止在程序编写的过程 ...
- Java中的集合Collections工具类(六)
操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集 ...