java中给对象的List集合去重的几种方法(Lambda)
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)相关推荐
- python list去重时间复杂度_List集合去重的一种方法 z
需要对一个List集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和HashSet都不是我想要的,便采用了一下方 ...
- java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)
java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...
- List 集合去重的 3 种方法
问题由来 在实际开发的时候,我们经常会碰到这么一个困难:一个集合容器里面有很多重复的对象,里面的对象没有主键,但是根据业务的需求,实际上我们需要根据条件筛选出没有重复的对象. 比较暴力的方法,就是根据 ...
- Java8 中通过 Stream 对列表进行去重的几种方法
点击关注公众号,实用技术文章及时了解 来源:juejin.cn/post/6844903842132262926 在这里我来分享几种列表去重的方法,算是一次整理吧,如有纰漏,请不吝赐教. 1. Str ...
- List集合去重的一种方法
前一段时间们需要对一个List<Model>集合去重,情况是该集合中会出现多个Name属性值相同的,但是其他属性值不同的数据. 在这种情况下,需求要只保留其中一个就好. 我觉得遍历和Has ...
- java中如何读写文件_JAVA: 读写文件的几种方法
如果您使用java8,可以也参考这篇文章:JAVA: Java8流逐行读取文件 import java.io.BufferedReader; import java.io.BufferedWriter ...
- java list转set去重_Java中List去重的四种方法
Java中List去重的四种方法 package com.lxz.test; import java.util.ArrayList; import java.util.HashSet; import ...
- Java中的对象类型像引用还是指针,谁是谁非?
Java中的对象类型像引用还是指针,谁是谁非? 作者:海枫 地址:http://blog.csdn.net/linyt 作为一名程序员,我们应该对新知识和新技术刨根问底,而不应泛泛而谈.我未曾接触到J ...
- Java中的对象和类
一. OOP中的基本概念 Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计 ...
最新文章
- bluePen – 使用在线 CSS 编辑器美化你的网站
- 珠宝管理系统java,基于jsp的珠宝首饰进销存管理系统-JavaEE实现珠宝首饰进销存管理系统 - java项目源码...
- 鸿蒙技术2点O中国成功了吗,华为鸿蒙OS1.0回归,百万用户升级成功,粉丝:谷歌要哭鼻子了...
- 再谈PHP、Python与Ruby
- SQL索引碎片整理脚本
- 实时计算Flink 快速入门 —— 步骤二:注册上下游存储
- 完整仿写鸿洋WanAndroid网站客户端
- oracle连接和执行流程总结
- 单词计数 soj1076
- 正确的特征点匹配对_了解如何正确选择特征
- 刚接触mybatis,很容易分不清#{id}和#{param1}的使用情况,本篇文章详解了两者的作用以及使用情况
- VS2012快捷方式的路径
- matlab画站点降雨分布,matlab 怎样做整个中国各个气象站点上的温度变化趋势
- 考研失败最根本的5个原因!
- 中小网站运营推广思路
- Android APP 增量更新demo
- Kubernetes全套笔记
- 限时游戏开发大赛——Ludum Dare介绍
- 【DB宝35】使用MySQL 8.0 克隆(clone)插件快速添加MGR节点
- 什么是BGP线路?BGP线路机房好吗?