Java 8 Stream API处理集合数据

news2025/1/6 13:08:29

Java 8 API 添加了一个新的抽象称为Stream(流),以一种声明的方式处理数据

新建一个DTO用于测试

@Data
public class UserDTO {

    private String userId;
    private String userName;
    private Integer age;
    private String province;
    private String city;

    public UserDTO() {
    }

    public UserDTO(String userId, String userName, Integer age, String province, String city) {
        this.userId = userId;
        this.userName = userName;
        this.age = age;
        this.province = province;
        this.city = city;
    }
}

main方法执行验证

public static void main(String[] args) {

	List<UserDTO> list = new ArrayList<>();
	list.add(new UserDTO("111", "张三", 27, "广东", "深圳"));
	list.add(new UserDTO("222", "李四", 28, "福建", "厦门"));
	list.add(new UserDTO("333", "王五", 21, "广东", "深圳"));
	List<UserDTO> userList = new ArrayList<>();
	userList.add(new UserDTO("111", "张三", 27, "广东", "深圳"));
	userList.add(new UserDTO("555", "王五", 25, "北京", "北京"));

}

1、groupingBy数据分组

使用groupingBy对集合多个字段进行分组

// 使用groupingBy对集合多个字段进行分组
Map<String, List<UserDTO>> groupMap = list.stream()
		.collect(Collectors.groupingBy(a -> a.getProvince() + a.getCity()));
groupMap.forEach((k, v) -> {
	System.out.println("GroupingBy key:" + k);
	System.out.println("GroupingBy value:" + v);
});

输出

GroupingBy key:广东深圳
GroupingBy value:[UserDTO(userId=111, userName=张三, age=27, province=广东, city=深圳), UserDTO(userId=333, userName=王五, age=21, province=广东, city=深圳)]
GroupingBy key:福建厦门
GroupingBy value:[UserDTO(userId=222, userName=李四, age=28, province=福建, city=厦门)]

2、collect数据转换

将集合转换成map,注意:需使用唯一数据作为键,staffId如果存在重复,则报Duplicate key错误

Map<String, UserDTO> itemMap = list.stream()
		.collect(Collectors.toMap(UserDTO::getUserId, item -> item));

3、filter过滤数据

使用filter获取符合条件判断的数据

List<UserDTO> filterList = list.stream()
		.filter(a -> Objects.equals("张三", a.getUserName()))
		.collect(Collectors.toList());

4、noneMatch对比数据

对比两个集合的差集

获取list集合和userList集合过滤掉两个集合中名字和年龄相同的数据,只返回list集合的数据

List<UserDTO> users2 = list.stream().filter(a -> userList.stream()
				.noneMatch(b -> Objects.equals(a.getUserName(), b.getUserName()) && a.getAge() == b.getAge()))
				.collect(Collectors.toList());
users2.forEach(a -> {
	System.out.println(">>>>>user2<<<<<" + a.getUserName()+a.getProvince()+a.getCity());
}); 
输出:
>>>>>user2<<<<<李四福建厦门
>>>>>user2<<<<<王五广东深圳

获取userList集合和list集合过滤掉两个集合中名字和年龄相同的数据,只返回userList集合的数据

List<UserDTO> users3 = userList.stream().filter(a -> list.stream()
				.noneMatch(b -> Objects.equals(a.getUserName(), b.getUserName()) && a.getAge() == b.getAge()))
				.collect(Collectors.toList());
users3.forEach(a -> {
	System.out.println(">>>>>users3<<<<<" + a.getUserName()+a.getProvince()+a.getCity());
});
输出:
>>>>>users3<<<<<王五北京北京

5、map集合处理

两个不同对象集合相同字段赋值,并执行其他业务处理

Long roleId = 8888L;
List<UserRoleDTO> userList = list.stream().map(a-> {
	UserRoleDTO dto = new UserRoleDTO();
	BeanUtils.copyProperties(a, dto);
	dto.setRoleId(roleId);
	return dto;
}).collect(Collectors.toList());

6、anyMatch数据判断

使用 Java Stream 中的 anyMatch 方法时,通常会涉及到对集合数据进行条件判断,以便找到是否有满足特定条件的元素

注意:每条数据的age字段必须有值,不然a.getAge() < 25会报空指针

boolean anyMatch = list.stream().anyMatch(a -> a.getAge() < 25);

判断userName都不为空的情况下,返回true

boolean noneMatch = list.stream().noneMatch(a -> a.getUserName().isEmpty());

所有元素都满足条件的情况下,allMatch 返回 true

boolean allMatch = list.stream().allMatch(a -> a.getAge() > 20);

6、flatMap集合合并

List<UserDTO> flatMap = Stream.of(list.stream(), userList.stream())
		.flatMap(Function.identity()).collect(Collectors.toList());
System.out.println("flatMap size:" + flatMap.size());
flatMap size:5

7、distinct数据去重

distinct根据集合的某些字段进行去重处理

List<String> userNames = flatMap.stream().map(UserDTO::getUserName).distinct()
		.collect(Collectors.toList());
System.out.println("distinct:" + userNames);
distinct:[张三, 李四, 王五]

8、sorted排序

sorted 根据age字段对集合进行正序排序

List<UserDTO> sortList =  list.stream()
		.sorted(Comparator.comparingInt(UserDTO::getAge)).collect(Collectors.toList());
sortList.forEach(a -> {
	System.out.println("sorted:" + a.getUserName()+a.getAge());
});
sorted:王五21
sorted:张三27
sorted:李四28

根据age字段进行倒序排序

list.sort((u1, u2) -> Integer.compare(u2.getAge(), u1.getAge()));
list.forEach(a -> {
	System.out.println("Reverse order:" + a.getUserName()+a.getAge());
});
Reverse order:李四28
Reverse order:张三27
Reverse order:王五21

9、reduce运算

reduce对集合某个字段进行运算求和

int totalAge = list.stream().mapToInt(UserDTO::getAge).reduce(0, Integer::sum);
Total age:76

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

告别编程困惑:GDB、冯诺依曼、操作系统速通指南

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 目录 前言 一…

Jenkins 中自动化部署 Spring Boot 项目

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

cesium小知识:常见的20多种property详解

要详细解释 Cesium 中所有的 Property 类,内容确实会非常丰富且详尽。 Property 基础 Property 是 Cesium 中用于表示随时间或条件变化的值的基础类。它允许你定义属性值如何根据时间、用户交互或其他逻辑动态改变。Property 的设计使得你可以创建复杂的动画和交互效果,而…

PCL点云库入门——PCL库点云特征之点云法向量(NormalEstimation)及其可视化

1、PCL点云库中点云特征综述 1.1、点云特征综述 点云特征描述在三维数据处理领域扮演着至关重要的角色&#xff0c;它直接决定了后续的识别、分类以及重建等关键任务的执行效果。在众多的特征描述方法中&#xff0c;我们可以看到基于几何形状的特征、基于统计信息的特征以及…

【《python爬虫入门教程11--重剑无峰168》】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 【《python爬虫入门教程11--selenium的安装与使用》】 前言selenium就是一个可以实现python自动化的模块 一、Chrome的版本查找&#xff1f;-- 如果用edge也是类似的1.chrome…

C++之map和set的模拟实现

目录 引言 红黑树迭代器实现 红黑树元素的插入 map模拟实现 set模拟实现 之前我们已经学习了map和set的基本使用&#xff0c;但是因为map和set的底层都是用红黑树进行封装实现的&#xff0c;上期我们已经学习了红黑树的模拟实现&#xff0c;所以本期我们在红黑树模拟实现…

黑马JavaWeb开发跟学(十四).SpringBootWeb原理

黑马JavaWeb开发跟学 十四.SpringBootWeb原理 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪…

十二、Vue 路由

文章目录 一、简介二、安装与基本配置安装 Vue Router创建路由实例在应用中使用路由实例三、路由组件与视图路由组件的定义与使用四、动态路由动态路由参数的定义与获取动态路由的应用场景五、嵌套路由嵌套路由的概念与配置嵌套路由的应用场景六、路由导航<router - link>…

【C++笔记】红黑树(RBTree)深度剖析和AVL树的对比分析

【C笔记】红黑树(RBTree)深度剖析和AVL树的对比分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】红黑树(RBTree)深度剖析和AVL树的对比分析前言一.红黑树的定义1.1 红黑树的概念1.2红黑树的规则1.3 红黑树对比A…

grouped.get_group((‘B‘, ‘A‘))选择分组

1. df.groupby([team, df.name.str[0]]) df.groupby([team, df.name.str[0]]) 这一部分代码表示对 DataFrame df 按照 两个条件 进行分组&#xff1a; 按照 team 列&#xff08;即团队&#xff09;。按照 name 列的 首字母&#xff08;df.name.str[0]&#xff09;。 df.name.s…

计算机毕设-基于springboot的食品厂管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

【Ubuntu20.04】Apollo10.0 Docker容器部署+常见错误解决

官方参考文档【点击我】 Apollo 10.0 版本开始&#xff0c;支持本机和Docker容器两种部署方式。 如果您使用本机部署方式&#xff0c;建议使用x86_64架构的Ubuntu 22.04操作系统或者aarch64架构的Ubuntu 20.04操作系统。 如果您使用Docker容器部署方式&#xff0c;可以使用x…

Java项目实战II基于小程序的驾校管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着汽车保有量的不断增长&#xff0c;驾驶培训市场日…

基于STM32F103的USART的原理及应用(一)(实现手机BLE和MCU进行通信)

一&#xff0c;查阅数据手册&#xff0c;找到对应的IO口和外设总线并配置好外设源文件 想了解USART的具体原理的小伙伴请进传送门&#xff1a;&#xff08;总结&#xff09;STM32中USART原理及应用&#xff08;PC、BLE、ESP8266通信实现&#xff09;-CSDN博客 二&#xff0c;打…

C#实现画图,及实现图像运动,C#中GDI+图形图像技术(Graphics类、Pen类、Brush类)C#之快速入门GDI+绘图 C#实现快速画图功能

下载源码 <-------- 在C#的世界里&#xff0c;GDI如同一位多才多艺的艺术家&#xff0c;以其强大的绘图能力&#xff0c;让开发者能够轻松地在应用程序中挥洒创意&#xff0c;绘制出丰富多彩的图形世界。GDI不仅支持基本的几何图形绘制&#xff0c;还能处理复杂的图像处理任…

Python应用指南:高德交通态势数据

在现代城市的脉络中&#xff0c;交通流量如同流动的血液&#xff0c;交通流量的动态变化对出行规划和城市管理提出了更高的要求。为了应对这一挑战&#xff0c;高德地图推出了交通态势查询API&#xff0c;旨在为开发者提供一个强大的工具&#xff0c;用于实时获取指定区域或道路…

数据结构与算法Python版 图的应用与广度优先搜索

文章目录 一、图的应用-词梯问题二、图的广度优先搜索 一、图的应用-词梯问题 词梯问题 Word Ladder 从一个单词演变到另一个单词&#xff0c;其中的过程可以经过多个中间单词。要求是相邻两个单词之间差异只能是1个字母如FOOL变SAGE&#xff1a;FOOL >> POOL >>…

服务器数据恢复—服务器硬盘亮黄灯的数据恢复案例

服务器硬盘指示灯闪烁黄灯是一种警示&#xff0c;意味着服务器硬盘出现故障即将下线。发现这种情况建议及时更换硬盘。 一旦服务器上有大量数据频繁读写&#xff0c;硬盘指示灯会快速闪烁。服务器上某个硬盘的指示灯只有黄灯亮着&#xff0c;而其他颜色的灯没有亮的话&#xff…

Java SpringBoot使用EasyExcel导入导出Excel文件

点击下载《Java SpringBoot使用EasyExcel导入导出Excel文件(源代码)》 在 Java Spring Boot 项目中&#xff0c;导入&#xff08;读取&#xff09;和导出&#xff08;写入&#xff09; Excel 文件是一项常见的需求。EasyExcel 是阿里巴巴开源的一个用于简化 Java 环境下 Excel…

Deduction(演绎法)和Reduction(还原法)-关于中西方思维的差异

Deduction(演绎法)和Reduction(还原法)-关于中西方思维的差异 最近看到中国新一代战机上天的消息,感慨万千;忽然想起来两年多前一次爬山的时候,一个友人跟我大概说过,Deduction和Reduction分别对应了中国古代和西方古代以来的思考自然和技术发明的思想.于是又在这方面琢磨了一番…