码迷,mamicode.com
首页 > 其他好文 > 详细

--------------------------------------集合List去重总结------------------------

时间:2019-11-19 16:57:56      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:ali   version   nts   lambda   数组实现   tran   Collector   public   data   

# java----->集合List去重总结 List是实际开发中非常常用的集合,此处简单总结lsit的去重 观察源码: 继承父类Collection:public interface List extends Collection {} 最常用的实现类:public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { private static final long serialVersionUID = 8683452581122892189L; private static final int DEFAULT_CAPACITY = 10; //默认容量 private static final Object[] EMPTY_ELEMENTDATA = {}; //空元数据 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transient Object[] elementData; private int size; } ##### ** 实现类的特点:** ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。 LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作,随机访问效率低,但随机插入、随机删除效率低。 ====================================分割线================================================= - **场景1:** 如果list中的类型,是类似String,long等类型,可以直接对每一个元素来进行判断和去重,那么可以利用Set或者stream的去重distinct来完成 **去重方法1:利用Set集合去重** //List转Set Set set = new HashSet<>(list); //Set转List List list_1 = new ArrayList<>(set); ** 去重方法2:利用distinct去重** list.stream().distinct(); - **场景2:** 如果list集合中存储的是对象,那么要根据对象的属性值来进行比较,才能判断是否为同一个对象,那么要进行取值判断 ** 去重方法3:利用stream** userContactsList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(UserContactsDto::getPhoneNumber))), ArrayList::new)); 原理说明: streamAPI的聚合操作collect可以让我们只关注结果,而collect方法里的collectingAndThen又是属 于 ? ? ? ? ? ? ? ?java.util.stream.Collector,collectingAndThen操作的解释是:先执行前面的操作,然后执行第二部操作后输出结果,这里我们执行的第一步操作就是Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(UserContactsDto::getPhoneNumber))),第二步就是将他输出为一个新的ArrayList。 第一步操作里又是用到Collectors接口,这次用的是toCollection方法,就是将方法里的函数或者参数转化为一个collection集合,这里,我们是将Comparator.comparing(UserContactsDto::getPhoneNumber)转化为一个collection,这个collection是一个TreeSet。也就是有序的。因为我们需要去掉重复的值,这个set可以做到,而我们又要保持转化出来的collection依旧有序,所以使用的是一个TreeSet。 Comparator.comparing(UserContactsDto::getPhoneNumber)这里呢,又用到了java.util.Comparator接口,这个接口倒是挺常用的。使用的是他的comparing方法,也就是比较参数的值是否相同,里面用到的是java8的新特性lambda表达式, :: 其实和.没太大区别,举个例子,最常用的System.out.println() 可以表达为System.out::println,可以达到一样的效果 ———————————————————————————————————————————————— 参考博客: https://blog.csdn.net/iloveme1/article/details/80589281

--------------------------------------集合List去重总结------------------------

标签:ali   version   nts   lambda   数组实现   tran   Collector   public   data   

原文地址:https://www.cnblogs.com/guangquan/p/11890482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!