使用stream流根据对象属性对复杂list对象去重
日常开发中,我们可能会遇到这样一种情况,需要对数据库查询出来的数据进行一个二次处理,从而达到我们需要的数据结构。stream流正是java8提供的对复杂list操作方便工具。
我们先介绍如何使用stream流根据对象属性对复杂list对象去重,再介绍一下stream流最常用的一些操作:
使用stream流根据对象属性对复杂list对象去重
例子1
实体类:
import lombok.Data;@Data
public class SyncUserDto {private String id;private String name;private String code;private String departmentCode;private String departmentName;private String position;private String phone;private String mobile;private String email;private Integer sex;private String idcard;private Integer status;private String account;private String weighting;private String photourl;private String openid;private String userid;
}
去重操作:
//去重ArrayList<SyncUserDto> collect = syncUserDtos.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>((o1, o2) -> {if (o1.getAccount().compareTo(o2.getAccount()) == 0) {return 0;} else {return o1.getAccount().compareTo(o2.getAccount());}})), ArrayList::new));
例子2
实体类:
public class User {private String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String id, String name) {super();this.id = id;this.name = name;}
}
去重:
public class Demo {public static void main(String[] args) {List<User> list = new ArrayList<>();User u1 = new User("a", "aaa");User u2 = new User("a", "aaa");User u3 = new User("b", "aaa");User u4 = new User("a", "b");User u5 = new User("b", "a");list.add(u1);list.add(u2);list.add(u3);list.add(u4);list.add(u5);list.add(u1);list.add(u2);list.add(u3);list.add(u4);list.add(u5);List<User> unique=list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()->new TreeSet<>((o1,o2)->{if (o1.getName().compareTo(o2.getName()) == 0) {return 0;} else {return o1.getName().compareTo(o2.getName());}})), ArrayList::new));System.out.println("根据对象属性name进行去重");System.out.println("---------- 去重前----------");System.out.println("集合中元素的个数为:"+list.size());for (User user : list) {System.out.println(user.toString()+"--姓名:"+user.getName());}System.out.println("-----------去重后----------");System.out.println("集合中元素的个数为:"+unique.size());for (User user : unique) {System.out.println(user.toString()+"--姓名:"+user.getName());}}
}
stream流常用操作
forEach():遍历流中的对象
public class Aoo {public static void main(String[] args) {// 定义一个集合ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("李四");list.add("李四");list.add("李四");list.add("李四");list.add("李四");//遍历流的对象list.stream().forEach((name) -> System.out.println(name));}
filter():filter对流对象进行过滤
public class Aoo {public static void main(String[] args) {// 定义一个集合ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("李四二");list.add("李四我");list.add("李四去晚");list.add("李四请问");list.add("李四去");list.add("李四我");//过滤流的对象list.stream().filter((name) -> name.length()==2);}
map():map()是对集合中的对象进行映射的,将对象从一种类型转换成另一种类型
public class Aoo {public static void main(String[] args) {// 定义一个集合ArrayList<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");list.add("7");//map()是对集合中的对象进行映射的,将对象从一种类型转换成另一种类型list.stream().map(num -> Integer.parseInt(num));}}
count():count是对流数据统计的方法,但是count之后返回的是long类型,所以无法再进行流操作。
public class Aoo {public static void main(String[] args) {// 定义一个集合ArrayList<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");list.add("7");//count()对流数据进行统计System.out.println(list.stream().count());}}
limit():选取流数据的前多少条数据
public class Aoo {public static void main(String[] args) {// 定义一个集合ArrayList<String> list = new ArrayList<>();list.add("李四1");list.add("李四2");list.add("李四3");list.add("李四4");list.add("李四5");list.add("李四6");list.add("李四7");//limit() 选取流数据的前多少条数据list.stream().limit(2);}
}
skip():跳过流数据的前多少条数据,该方法与limit()方法刚好相反
public class Aoo {public static void main(String[] args) {// 定义一个集合ArrayList<String> list = new ArrayList<>();list.add("李四1");list.add("李四2");list.add("李四3");list.add("李四4");list.add("李四5");list.add("李四6");list.add("李四7");//skip() 跳过流数据的前多少条数据list.stream().skip(2);}
}
concat():Stream的静态方法concat()实现对两个流数据进行合并
public class Aoo {public static void main(String[] args) {// 定义一个集合ArrayList<String> list = new ArrayList<>();list.add("李四1");list.add("李四2");list.add("李四3");list.add("李四4");list.add("李四5");list.add("李四6");list.add("李四7");// 定义一个集合ArrayList<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");list1.add("6");list1.add("7");//concat()实现对两个流数据进行合并Stream.concat(list.stream(),list1.stream());}}
相关文章:
使用stream流根据对象属性对复杂list对象去重
日常开发中,我们可能会遇到这样一种情况,需要对数据库查询出来的数据进行一个二次处理,从而达到我们需要的数据结构。stream流正是java8提供的对复杂list操作方便工具。 我们先介绍如何使用stream流根据对象属性对复杂list对象去重࿰…...
vue3脚手架搭建
一.安装 vue3.0 脚手架 如果之前安装了2.0的脚手架,要先卸载掉,输入: npm uninstall vue-cli -g 进行全局卸载 1.安装node.js(npm) node.js:简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是…...
MongoDB 未授权访问漏洞
简介 MongoDB是一个基于分布式文件存储的数据库,是一个介于关系数据库和非关系数据库之间的产品,它的特点是高性能、易部署、易使用,存储数据非常方便,默认情况下是没有认证的这就导致不熟悉它的研发人员部署后没有做访问控制导致…...
花5分钟学习机器学习基础知识
一、什么是机器学习 机器学习的目的是让机器学习,而不是执行预设的算法。 机器学习适用于难以制定规则的问题,如垃圾邮件识别、图像识别。 机器学习模拟人类学习过程:从样本中学习归纳总结,形成模型,然后应用模型完成任务。 机器学习需要大量样本数据和计算能力支持。当前数…...
Qt学习:使用OpenGL绘制3D图形
文章目录 前言一、Qt下使用OpenGL绘制图形介绍二、示例完整代码总结 前言 文章中引用的内容均来自这本书中的原文:【Qt Creator快速入门_霍亚飞编著】,本文的示例也是在书中代码的基础上进行编写的(其中部分代码使用原文编译不过,…...
在chrom浏览器安装Vue.js devtools插件,遇到恶意扩展程序字样,附百度网盘下载链接
遇到的问题 拖拽下载好的 Vue.js devtools 插件到谷歌扩展程序, 百度网盘下载地址 链接:https://pan.baidu.com/s/1FeK6pwc2UzRUUlMFN3rW5w?pwdw361 提取码:w361 提示: 解决办法 将Vue.js devtools 插件的后缀从.crx改为.zi…...
WSL2的安装与配置(创建Anaconda虚拟环境、更新软件包、安装PyTorch、VSCode)
1. WSL2 安装 以管理员身份打开 PowerShell(“开始”菜单 >“PowerShell” >单击右键 >“以管理员身份运行”),然后输入以下命令: dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /a…...
【鸿蒙软件开发】ArkTS常见组件之单选框Radio和切换按钮Toggle
文章目录 前言一、Radio单选框1.1 创建单选框1.2 添加Radio事件1.3 场景示例二、切换按钮Toggle2.1 创建切换按钮2.2 创建有子组件的Toggle2.3 自定义样式selectedColor属性switchPointColor属性 2.4 添加事件2.5 示例代码 总结 前言 Radio是单选框组件,通常用于提…...
今年阿里云双十一服务器优惠价格讨论_看看大家怎么说?
2023阿里云双十一云服务器大概会降到什么区间?阿里云服务器网认为会在当前的优惠价格基础上,降价10%左右,可以在阿里云CLUB中心领券:aliyun.club 云服务器专用满减优惠券。阿里云服务器网从各个渠道了解到大家对今年阿里云双十一服…...
LC-1402. 做菜顺序(记忆化搜索 ==> 动态规划、贪心)
1402. 做菜顺序 困难 一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间(包含之前每道菜所花费的时间)乘以这道菜的满意程度&#x…...
泰森多边形
泰森多边形 93 泰森多边形又叫沃洛诺伊图(Voronoi diagram),得名于Georgy Voronoi,是一组由连接两邻点线段的垂直平分线组成的连续多边形。一个泰森多边形内的任一点到构成该多边形的控制点的距离小于到其他多边形控制点的距离。…...
YOLOV8 进行docker环境配置
修改docker文件 原docekerfile中ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Arial.Unicode.ttf /root/.config/Ultralytics/下载很慢,可以在外部下载好,放入docker文件夹中,再将源代码改为ADD Arial.ttf…...
sealos一键部署K8S环境(sealos3.0时代教程过时了,目前已经4.0了,请移步使用Sealos一键安装K8S)
1 安装Sealos(4.0版本) sealos部署k8s贼方便,只需要一条init命令即可,3分钟部署完(下载安装包的时间不算)。 官方教程:https://www.sealyun.com/instructions/1st #主机名: hostnamectl set-hostname mas…...
【C++】stackqueue
适配器是一种设计模式 , 该种模式是将一个类的接口转换成客户希望的另外一个接口 。 虽然 stack 和 queue 中也可以存放元素,但在 STL 中并没有将其划分在容器的行列,而是将其称为 容器适配 器 ,这是因为 stack 和队列只是对其他容…...
Hive篇面试题+详解
Hive篇面试题 1.什么是Hive?它的主要功能是什么? Hive是一个基于Hadoop的数据仓库工具,它提供了一个类SQL的查询语言(HiveQL)来查询和分析存储在Hadoop集群中的大规模数据。Hive的主要功能是将结构化数据映射到Hadoop…...
Mysql批量插入更新如何拆分大事务?
拆分大事务 一、解决方案二、遇到问题之前在运行Mysql任务的时候报错:binlog(1610646347 bytes) write threshold exceeded,原因是Mysql任务提交的是个大事务,超出binlog设定阈值,使得系统自动终止事务 一、解决方案 使用limit分页拆分大事务 CREATE PROCEDURE `split_tran…...
【计算机网络原理】初始网络基础
文章目录 1. 网络发展史1.1 单机时代1.2 网络互连局域网 LAN广域网 WAN 2. 网络通信基础2.1 IP 地址2.2 端口号2.3 协议2.4 五元组2.5 协议分层2.5.1 OSI七层模型2.5.2 TCP/IP五层模型 2.6 封装和分用2.6.1 数据封装(发送方情况)2.6.2 数据分用(接收方情况) 总结 1. 网络发展史…...
【sqlserver】配置管理器打不开
问题描述 无法连接到 WMI 提供程序。您没有权限或者该服务器无法访问。请注意,您只能使用SQL Server 配置管理器来管理 SQL Server 2005 和更高版本的服务 器。无效类[0x80041010] 解决方式: 命令提示符-右键-以管理员身份运行,再把以下代码执行一遍&…...
磁盘清理 | 已经卸载的软件还出现在应用和功能里怎么办?
一句话总结解决方法: 安装Geek Uninstaller,删除卸载残留。 问题描述: 最近磁盘满了,需要删除一些平时不常用的软件,但是发现一个问题。就是已经删除的软件,仍然会出现在“应用与功能”中。并且显示卸载图标为灰色&am…...
C++之异常
目录 一、C语言传统的处理错误的方式 二、C的异常 1、概念 2、关键字 3、基本格式 三、异常的抛出和捕获 1、异常的抛出和匹配原则 2、 在函数调用链中异常栈展开匹配原则 四、异常抛派生类,基类捕获 五、异常的重新抛出 六、异常安全 七、异常的优缺点…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
