java中给对象的List集合去重的几种方法

  • 前言
  • 一、lambda表达式的去重方式
  • 二、Stream API中的collect去重方法
  • 三、Stream API 中的distinct方法去重

前言

JDK8的对象去重方式的总结,不包含常规的去重方式,例如:List、Set(HashSet)、TreeSet和LinkedHashSet的遍历去重方式。包含lambda表达式的去重方式、Stream API的去重方式,distinct
如果有解释错误的地方,欢迎留言指正哦!!!


一、lambda表达式的去重方式

lambda表达式去重有两个值得注意的点,一个是JDK8的四大内置函数式接口。另一个ConcurrentHashMap集合。

这里用到了ConcurrentHashMap的putIfAbsent方法,这也是该去重方法的核心。该方法存入的参数会生成一对键值对保存,**如果集合中没有存入过该键值对,那么会返回null,如果已经存入了,那么返回该key对应的value。配合JDK8的Predicate断言式函数式接口,如果是null 那么表示还没存入即没有重复,返回true。那么调用该方法时,通过filter将返回值为true的对象保留。**则实现的对集合中对象的某一属性去重。

private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {Map<Object, Boolean> seen = new ConcurrentHashMap<>();return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;}

附上putIfAbsent方法的源码:

  default V putIfAbsent(K key, V value) {V v = get(key);if (v == null) {v = put(key, value);}return v;}

二、Stream API中的collect去重方法

该方法的核心是TreeSet。我们都知道,默认情况下,TreeSet可以实现去重并且按照自然顺序排序。同样的,还有HashSet以及LinkedHashSet都可以实现去重,但对于实体类对象,后两者的去重与实体类中equals和hashCode方法的实现有关。
要实现对实体类对象的去重需要引入比较器(或者实体类需要实现Comparable中的compareTo方法)。如果不使用比较器,那么将会报错(只针对TreeSet,HashSet以及LinkedHashSet都不会报错);

java.lang.ClassCastException: com.asiainfo.grid.sop.base.po.GsopKpiPool cannot be cast to java.lang.Comparable

接下来,我们使用TreeSet来去重。TreeSet根据Comparator中写入的对象的某一属性去重

 Set<GsopKpiPool> gsopKpiPools = new TreeSet<>(Comparator.comparing(GsopKpiPool::getSourceTable));gsopKpiPools.addAll(cpList);gsopKpiPools.forEach(t->System.out.println(t));System.out.println("-----------------------将TreeSet转换成List");ArrayList<GsopKpiPool> gsopKpiPools1 = Lists.newArrayList(gsopKpiPools);gsopKpiPools1.forEach(t->System.out.println(t));

Collectors的collectingAndThen方法,则是执行完Collector之后,将该集合以某种格式返回

cpList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()->new TreeSet<>(Comparator.comparing(GsopKpiPool::getSourceTable))), ArrayList::new));
//上述代码相当于
cpList.stream().collect(Collectors.toCollection(()->new ArrayList<>(new TreeSet<>(Comparator.comparing(GsopKpiPool::getSourceTable)))));

三、Stream API 中的distinct方法去重

使用该方法对实体类对象去重需要重写实体类的equals和hashCode方法。否则起不到任何去重的效果。

List<GsopKpiPool> collect = cpList.stream().distinct().collect(Collectors.toList());

equals和hashCode方法的重写就不多做解释啦……

java中给对象的List集合去重的几种方法(Lambda)相关推荐

  1. python list去重时间复杂度_List集合去重的一种方法 z

    需要对一个List集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和HashSet都不是我想要的,便采用了一下方 ...

  2. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  3. List 集合去重的 3 种方法

    问题由来 在实际开发的时候,我们经常会碰到这么一个困难:一个集合容器里面有很多重复的对象,里面的对象没有主键,但是根据业务的需求,实际上我们需要根据条件筛选出没有重复的对象. 比较暴力的方法,就是根据 ...

  4. Java8 中通过 Stream 对列表进行去重的几种方法

    点击关注公众号,实用技术文章及时了解 来源:juejin.cn/post/6844903842132262926 在这里我来分享几种列表去重的方法,算是一次整理吧,如有纰漏,请不吝赐教. 1. Str ...

  5. List集合去重的一种方法

    前一段时间们需要对一个List<Model>集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和Has ...

  6. java中如何读写文件_JAVA: 读写文件的几种方法

    如果您使用java8,可以也参考这篇文章:JAVA: Java8流逐行读取文件 import java.io.BufferedReader; import java.io.BufferedWriter ...

  7. java list转set去重_Java中List去重的四种方法

    Java中List去重的四种方法 package com.lxz.test; import java.util.ArrayList; import java.util.HashSet; import ...

  8. Java中的对象类型像引用还是指针,谁是谁非?

    Java中的对象类型像引用还是指针,谁是谁非? 作者:海枫 地址:http://blog.csdn.net/linyt 作为一名程序员,我们应该对新知识和新技术刨根问底,而不应泛泛而谈.我未曾接触到J ...

  9. Java中的对象和类

    一. OOP中的基本概念     Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计 ...

最新文章

  1. bluePen – 使用在线 CSS 编辑器美化你的网站
  2. 珠宝管理系统java,基于jsp的珠宝首饰进销存管理系统-JavaEE实现珠宝首饰进销存管理系统 - java项目源码...
  3. 鸿蒙技术2点O中国成功了吗,华为鸿蒙OS1.0回归,百万用户升级成功,粉丝:谷歌要哭鼻子了...
  4. 再谈PHP、Python与Ruby
  5. SQL索引碎片整理脚本
  6. 实时计算Flink 快速入门 —— 步骤二:注册上下游存储
  7. 完整仿写鸿洋WanAndroid网站客户端
  8. oracle连接和执行流程总结
  9. 单词计数 soj1076
  10. 正确的特征点匹配对_了解如何正确选择特征
  11. 刚接触mybatis,很容易分不清#{id}和#{param1}的使用情况,本篇文章详解了两者的作用以及使用情况
  12. VS2012快捷方式的路径
  13. matlab画站点降雨分布,matlab 怎样做整个中国各个气象站点上的温度变化趋势
  14. 考研失败最根本的5个原因!
  15. 中小网站运营推广思路
  16. Android APP 增量更新demo
  17. Kubernetes全套笔记
  18. 限时游戏开发大赛——Ludum Dare介绍
  19. 【DB宝35】使用MySQL 8.0 克隆(clone)插件快速添加MGR节点
  20. 什么是BGP线路?BGP线路机房好吗?

热门文章

  1. 机器学习项目入门篇:一个完整的机器学习项目
  2. HDU-6555-The Fool(整除分块)
  3. python-基础语法
  4. python 数组写入文件 并 读取
  5. 本周最新文献速递20220522
  6. 基于PHP聊天室的编程思想
  7. 如何学习一门新的计算机语言
  8. Altium Designer -- EMC/EMI电路设计经验
  9. 多核CPU和单核的区别~
  10. 3.2 二维随机变量的边缘分布