【java】对list集合进行去重 传统方式 VS Lambda
说道集合的去重,我们就肯定能想到唯一元素集合set,还有map中的key。那么我们传统的去重的方式肯定是要选择set或者是map来实现了,另外在对实体对象类型进行去重的时候,我们可能会指定实体中的一个字段,这种情况也是属于多数的,那么我们要怎么实现呢?
一、传统map实现
首先我们来看map实现,由于list内对象是不固定的,所以我这里写了一个通用的,按照id去重的例子:
当然这里还加入了一些自定义的配置,如字段为空的时候就舍弃等,可以看出来都是根据map特性,如果在map中找到了值,则不再add。
如果扩展成根据指定字段去重,则代码修改为把字段的string传入即可:
if (StringUtils.isBlank(filedName)){
return objList;
}
List<E> newList = new ArrayList<>();
HashMap<String, String> map = new HashMap<>();
for (E t : objList) {
// 为空则不进行比较(按需确定是否要添加)
if (org.springframework.util.StringUtils.isEmpty(getFieldValue(t,filedName))) {
continue;
}
String id = String.valueOf(getFieldValue(t,filedName));
String value = map.get(id);
if (org.springframework.util.StringUtils.isEmpty(value)) { //如果value是空的 说明取到的这个name是第一次取到
map.put(id, id);
newList.add(t); //newList就是我们想要的去重之后的结果
}
}
return newList;
}
如果要根据多个字段去重,需要怎样呢?扩展第二个参数为字符数组即可:
if (filedNames==null||filedNames.length==0){
return objList;
}
List<E> newList = new ArrayList<>();
HashMap<String, String> map = new HashMap<>();
for (E t : objList) {
String key = "";
for (int i = 0; i < filedNames.length; i++) {
key += String.valueOf(getFieldValue(t,filedNames[i]));
}
String value = map.get(key);
if (org.springframework.util.StringUtils.isEmpty(value)) { //如果value是空的 说明取到的这个name是第一次取到
map.put(key, key);
newList.add(t); //newList就是我们想要的去重之后的结果
}
}
return newList;
}
有了map的实现,set的也不难了,只需要把里面判断和添加map的代码修改为set对象即可。
二、labmda实现
lambda实现就比较简单了,看一下三连:
单个字段去重:
Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(member -> member.getName()))), ArrayList::new));
多个字段去重:
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(member -> member.getName()+"-"+member.getId()))), ArrayList::new));
还有一个根据某个或者几个字段分组,也可以满足这种需求:
Map<String,List<Member>> map = members.stream().collect(Collectors.groupingBy(Member::getName));
三、总结
相比较来说,使用lambda进行去重,写法比较简单,代码简洁有利于阅读,而传统方式则过于繁琐,需要写专门的util进行处理,但是从另外的角度来讲传统方式比较灵活,可以增加lambda没有的判断,如果需要去重的字段有为null的情况,使用lambda分组或者去重是会报空指针错误的。
【java】对list集合进行去重 传统方式 VS Lambda的更多相关文章
- 练习:集合元素处理(传统方式)-练习:集合元素处理(Stream方式)
练习:集合元素处理(传统方式) 题目 现在有两个ArrayList集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环依次进行以下若干操作步骤︰ 1.第一个队伍只要名字为3个字的 ...
- java中遍历集合的三种方式
第一种遍历集合的方式:将集合变为数组 package com.lw.List; import java.util.ArrayList; import java.util.List; import ja ...
- Java遍历List集合的4种方式
public class Test { public static void main(String[] args) { // 循环遍历List的4中方法 List<String> str ...
- List集合对象去重及按属性去重的8种方法-java基础总结系列第六篇
最近在写一些关于java基础的文章,但是我又不想按照教科书的方式去写知识点的文章,因为意义不大.基础知识太多了,如何将这些知识归纳总结,总结出优缺点或者是使用场景才是对知识的升华.所以我更想把java ...
- paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较
paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...
- java List递归排序,传统方式和java8 Stream优化递归,无序的列表按照父级关系进行排序(两种排序类型)
当有一个List列表是无序的,List中的数据有parentid进行关联,通过java排序成两种排序类型: 所用的测试列表最顶级无parentid,若为特殊值,修改下判断方法即可. 第一种排序:按照树 ...
- Java集合01----ArrayList的遍历方式及应用
Java集合01----ArrayList的遍历方式及应用 前面已经学习了ArrayList的源代码,为了学以 ...
- Java List集合 遍历 四种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.ArrayList; import java.util.List; /** * @A ...
- Java Map集合 遍历 五种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.HashMap; import java.util.Iterator; import ...
- Java中的集合概述
Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...
随机推荐
- 2024 盘古石数据取证 服务器部分wp
1. 分析内部IM服务器检材,在搭建的内部即时通讯平台中,客户端与服务器的通讯端口是:[答案格式:8888][★☆☆☆☆] 8065 2. 分析内部IM服务器检材,该内部IM平台使用的数据库版本是: ...
- Redis应用—3.在购物车里的应用
大纲 1.社区电商购物车的读多写多场景分析 2.购物车的复杂缓存与异步落库(Sorted Set + Hash -> hPut + zadd) 3.购物车异步落库与完整加入流程(缓存雪崩 + M ...
- orangepi zero3开启指定频段WiFi热点的指令
步骤 通过 -c 命令即可指定wifi频段,避免和其他wifi的频段撞在一起. 例如下面这条命令创建了一个频段为40,WiFi名为zero3,网段为192.168.12.0/24的WiFi热点 sud ...
- 使用IntersectionObserver 实现懒加载 && 记录一个懒加载失效的原因
先说说我实现懒加载失效的一个原因: 是图片没有写高度 猜想是没有给图片高度,所以底层没法进行计算 容器是否出现在视图中 IntersectionObservers作用 提供了一种异步观察目标元素与其祖 ...
- Lummmax 雷曼克斯 翔龙 X15 专业对讲机常用功能
Lummmax 雷曼克斯 翔龙 X15 专业对讲机常用功能 工作模式切换 ESC/M 在频率模式 (VFO) 与信道模式之间切换 编辑信道 在频率模式 (VFO) 下,输入目标频率并进行相关设置之后, ...
- 【Linux】【专项突破】CentOS下软件安装
目录 rpm yum软件仓库 配置文件 缓存处理 清理缓存 重构缓存 查询包的依赖关系 rpm # 普通下载安装 rpm -ivh 包名 # 更新 rpm -Uvh 包全名 # 查询 rpm -q 包 ...
- Python中指数概率分布函数的绘图详解
在数据科学和统计学中,指数分布是一种应用广泛的连续概率分布,通常用于建模独立随机事件发生的时间间隔.通过Python,我们可以方便地计算和绘制指数分布的概率密度函数(PDF).本文将详细介绍指数分布的 ...
- 使用archlinux AUR源下载安装的方法 以及 解决makepkg网络连接超时(time out)的问题
1.使用archlinux(AUR)源下载安装软件/驱动的方式 2.解决使用此方时无法通过网络下载资源文件的问题(网络连接超时/time out) 1.使用archlinux(AUR)源下载安装软件/ ...
- 比较IDEA与Eclipse
在IDEA的项目中,聚合工程或普通的根目录是工程(Project).它的每一个子模块(Module),都可以使用独立的JDK和Maven.下面的子工程称为模块(Module),子模块(Module)之 ...
- G1原理—3.G1是如何提升垃圾回收效率
大纲 1.G1为了提升GC的效率设计了哪些核心机制 2.G1中的记忆集是什么 3.G1中的位图和卡表 4.记忆集和卡表有什么关系 5.RSet记忆集是怎么更新的 6.DCQ机制的底层原理是怎样的 7. ...