Java 集合stream流操作示例详解

java小技能:Stream流操作【foreach、filter、map、collect】(根据分类ID穿透查询文章、返回树结构菜单列表) 终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。(遍历foreach、匹配find–match、规约reduce、聚合max–min–count、收集collect)中间操作,每次返回一个新的流,可以有多个。(筛选filter、映射map、排序sorted、去重组合skip—limit)需求:根据分类ID穿透查询文章,默认淘学院分类文章。生成树形结构菜单列表:递归获取子节点。 阅读详情

Java 集合stream流操作示例详解

自java 8 版本起推出集合stream流操作特性,确实非常方便的对list进行各种操作,告别使用for的时代来了。下面总结了一些常用的对List对象进行遍历、过滤、查询、去重、排序、分组、提取等操作示例,;

@Data
public class User{
	private Integer id;
	private String name;
	private String sex;
	private Integer age;
	private String department;
	private BigDecimal salary;
	public User(){

	}
	public User(Integer id,String name,String sex,Integer age,String department,BigDecimal salary){
		this.id=id;
		this.name=name;
		this.sex=sex;
		this.age=age;
		this.department=department;
		this.salary=salary;
	}
	
}

public class ListStream{

	public static void main(String [] args){
		List<User> userList = getUserList();
	}

	public static List<User> getUserList(){
        List<User> userList = new ArrayList<User>();
        userList.add(new User(1, "黄文隆", "男", 32, "研发部", BigDecimal.valueOf(3600)));
        userList.add(new User(2, "江奕云", "男", 30, "财务部", BigDecimal.valueOf(3800)));
        userList.add(new User(3, "刘姿婷", "女", 20, "人事部", BigDecimal.valueOf(3700)));
        userList.add(new User(4, "夏志豪", "男", 38, "研发部", BigDecimal.valueOf(3500)));
        userList.add(new User(5, "林雅南", "女", 25, "财务部", BigDecimal.valueOf(3200)));
        return userList;
    }
}

现在我们有一个List类型的列表,可以使用Java8的stream流对它进行遍历、过滤、查询、去重、排序、分组等操作。

遍历

userList.forEach(System.out::println);

过滤

通过filter()进行数据筛选过滤。

//获取部门为“研发部”的用户列表
userList = userList.stream().filter(user -> user.getDepartment() == "研发部").collect(Collectors.toList());

查询

//获取组织编号为“黄文隆”的组织信息,如果没有找到则返回null
User user = userList.stream().filter(u -> u.getName().equals("黄文隆")).findAny().orElse(null);

去重

使用 distinct() 方法可以去除重复的数据。

//获取部门列表,并去除重复数据
    List<String> departmentList = userList.stream().map(User::getDepartment).distinct().collect(Collectors.toList());

排序

使用sorted()方法进行数据排序

//根据年龄排序(升序)
userList = userList.stream().sorted((u1, u2) -> u1.getAge() - u2.getAge()).collect(Collectors.toList());
//推荐:userList = userList.stream().sorted(Comparator.comparingInt(User::getAge)).collect(Collectors.toList());
//降序:userList = userList.stream().sorted(Comparator.comparingInt(User::getAge).reversed()).collect(Collectors.toList());

分组

使用 groupingBy() 将数据进行分组,最终返回一个 Map 类型。

//根据部门对用户列表进行分组
Map<String,List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getDepartment));

//根据部门和性别对用户列表进行分组
Map<String,Map<String,List<User>>> userMap = userList.stream().collect(Collectors.groupingBy(User::getDepartment,Collectors.groupingBy(User::getSex)));

//根据部门进行分组,汇总各个部门用户的平均年龄
Map<String, Double> userMap = userList.stream().collect(Collectors.groupingBy(User::getDepartment, Collectors.averagingInt(User::getAge)));

提取

使用 map() 方法获取用户列表中的名称列。

//获取用户名称列表
List<String> nameList = userList.stream().map(User::getName).collect(Collectors.toList());
//或者:List<String> nameList = userList.stream().map(user -> user.getName()).collect(Collectors.toList());

判断(查找)

//判断用户列表中是否存在名称为“黄文隆”的数据
boolean result1 = userList.stream().anyMatch(user -> user.getName().equals("name_01"));

//判断用户名称是否都包含“黄”字段
boolean result2 = userList.stream().allMatch(user -> user.getName().contains("黄"));

//判断用户名称是否存在不包含“黄”字段
boolean result3 = userList.stream().noneMatch(user -> user.getName().contains("黄"));

统计

//用户列表中年龄的最大值、最小值、总和
int maxVal = userList.stream().map(User::getAge).reduce(Integer::max).get();
int minVal = userList.stream().map(User::getAge).reduce(Integer::min).get();
int sumVal = userList.stream().map(User::getAge).reduce(0,Integer::sum);

//用户列表中年龄的最大值、最小值、总和、平均值
int maxVal = userList.stream().mapToInt(User::getAge).max().getAsInt();
int minVal = userList.stream().mapToInt(User::getAge).min().getAsInt();
int sumVal = userList.stream().mapToInt(User::getAge).sum();
double aveVal =  userList.stream().mapToInt(User::getAge).average().getAsDouble();

//统计研发部的人数,使用 counting()方法进行统计
Long departCount = userList.stream().filter(user -> user.getDepartment() == "研发部").collect(Collectors.counting());

//统计30岁以上的人数,使用 count()方法进行统计(推荐)
Long ageCount = userList.stream().filter(user -> user.getAge() >= 30).count();

//统计薪资大于1500元的人数
Long salaryCount = userList.stream().filter(user -> user.getSalary().compareTo(BigDecimal.valueOf(1500)) == 1).count();

//计算年龄总和
int sumAge = userList.stream().collect(Collectors.summingInt(User::getAge));

//计算平均年龄
double aveAge = userList.stream().collect(Collectors.averagingDouble(User::getAge));

//获取IntSummaryStatistics对象
IntSummaryStatistics ageStatistics = userList.stream().collect(Collectors.summarizingInt(User::getAge));

//统计:最大值、最小值、总和、平均值、总数
System.out.println("最大年龄:" + ageStatistics.getMax());
System.out.println("最小年龄:" + ageStatistics.getMin());
System.out.println("年龄总和:" + ageStatistics.getSum());
System.out.println("平均年龄:" + ageStatistics.getAverage());
System.out.println("员工总数:" + ageStatistics.getCount());

//最高薪资
BigDecimal maxSalary = userList.stream().map(User::getSalary).max((x1, x2) -> x1.compareTo(x2)).get();

//最低薪资
BigDecimal minSalary = userList.stream().map(User::getSalary).min((x1, x2) -> x1.compareTo(x2)).get();

//薪资总和
BigDecimal sumSalary = userList.stream().map(User::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add);

//平均薪资
BigDecimal avgSalary = userList.stream().map(User::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(userList.size()), 2, BigDecimal.ROUND_HALF_UP);
点云配准实战:用DGCNN+Transformer+SVD搞定3D模型对齐(附PyTorch代码) 本文详细介绍了基于深度学习的点云配准实战方法,重点解析了Deep Closest Point (DCP)模型。该模型融合了DGCNN、Transformer和可微分SVD三大核心模块,能够端到端地预测点云间的刚性变换,有效克服传统ICP算法对初始位置敏感、易陷入局部最优的缺点。文章提供了完整的PyTorch代码实现、ModelNet40数据集处理、训练策略及显存优化技巧,旨在帮助开发者在机器人、自动驾驶等领域实现精准的3D模型对齐。 阅读详情

相关推荐

解决/usr/lib64/libstdc++.so.6和/lib64/libc.so.6版本过低问题

在CentOS7.0中编译好MySQL5.7.14之后,然后在CentOS6.5中初始化MySQL,执行:/usr/local/mysql/bin/mysqld --version出现如下问题:./bin/mysqld: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./bin/mysqld)

poxiaonie的博客 2万+

你需要了解的Java快捷开发 stream的使用(一) stream对List集合进行查询、统计等操作

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 元素流在管道中经过中间操作(intermediate operation)的处理,最

青冘的技术学习博客 8829

鲁棒优化入门(6)—Matlab+Yalmip两阶段鲁棒优化通用编程指南(上)

Matlab+Yalmip两阶段鲁棒优化通用编程指南(上篇),内容包括: ①.拿到一个复杂的两阶段鲁棒优化问题的分析步骤和方法。 ②.采用Yalmip工具箱中的uncertain函数和鲁棒优化模块求解两阶段鲁棒优化的子问题。 ③.Yalmip工具箱中的鲁棒优化模块和常规的求解思路有什么异同。 ④.使用KKT条件求解两阶段鲁棒优化的子问题,并使用C&CG算法进行迭代求解。

配电网和matlab的博客 1万+

Java List集合Stream流的使用(常用方法)

引言:Java stream流在对集合的操作中提供了很多非常好用的方法,下面的这些方法是在开发中比较常用的,可以实现对集合数据的过滤、查找、求和等等。 1、按条件查找,找到了返回一个对象,反之返回null // 查找id为6的用户信息 User user = getUsers().stream().filter(p -> p.getId() == 6).findAny().orElse(null); System.out.println(user != null ? user.toString().

记录工作开发中遇到的技术难点,方便自己查看,也希望可以帮助到他人... 9892

SAP成本计划BAPI接口BAPI_COSTACTPLN_POSTPRIMCOST深度解析与实战指南

在SAP ERP系统中,成本计划是财务与控制模块的核心功能,它涉及对企业未来成本支出的预测与规划。其原理是通过结构化数据模型,将成本要素分配到具体的成本对象上,以实现预算编制和成本控制。这一技术的核心价值在于实现成本数据的标准化、自动化处理,从而提升财务流程效率与数据准确性。在应用场景上,成本计划广泛应用于年度预算编制、项目成本预测、系统间数据集成以及历史数据迁移等关键业务环节。本文聚焦于实现上述流程自动化的关键技术——SAP标准接口BAPI_COSTACTPLN_POSTPRIMCOST,并深入探讨其在高

weixin_29657209的博客 350

11n、11ac、11ax和11be MCS表(全网最全)

1、无线协商速率介绍及计算 2、附11n、11ac、11ax 完整MCS速率表

weixin_41500064的博客 2万+

java8常见的stream流常用方法

整理的JAVA8的Stream流的一些常用方法

zhangshengqiang168的博客 5335

esp32c6 开发实战:低功耗蓝牙(BLE)开发

蓝牙栈在此程序流程中已经启动并运行,但是应用程序的功能尚未定义。功能的定义是通过响应事件来实现的,当其他设备尝试读取或写入参数以及建立连接时就会触发事件回调函数处理。BT控制器在控制器端实现主机控制器接口(HCI),链路层(LL)和物理层(PHY)。BT控制器对用户应用程序不可见,并处理BLE堆栈的较低层。蓝牙堆栈(Bluedroid stack)定义了经典蓝牙(BT Classic)和低功耗蓝牙(BLE)的通用定义和API。的判断)等对于启动低功耗蓝牙来说不重要的代码,函数初始化和启用BT控制器。

月入鱼饵的博客 2740

java中List Stream的简单使用

java中List Stream的简单使用 一,api入门案例 实体类 public class Person { private int id; private String name; private String desc; private int age; public Person(){ } public Person(int id, String name, String desc,int age) { this.i

test_00的博客 1268

DISK配置服务器软RAID工作任务(RAID1+BITLOCKER)-winserver4

DISK配置服务器软RAID工作任务(RAID1+BITLOCKER)-winserver4

新时代先锋的博客 7299

基于YOLOv8的表面裂痕等缺陷检测:深度学习与UI界面的实践

本文详细介绍了如何使用YOLOv8进行表面裂痕等缺陷检测,并结合图形用户界面展示检测结果。通过YOLOv8的强大能力,我们可以实现高效、准确的表面缺陷检测,提升工业产品的质量控制水平。未来,随着深度学习技术和数据集的不断发展,表面缺陷检测的精度和速度将不断提升,应用领域也将进一步拓展。希望本文的实践能够为深度学习在工业检测领域的应用提供一些启示。

YOLO 549

Java Stream 流操作与集合操作的差异对比,以及流操作的三个阶段分类

Java Stream 流操作与集合操作的差异对比,以及流操作的三个阶段分类

爱的叹息的专栏 858

《Python等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级谁》Python编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,限时9.9元,欢迎订阅!

人生就是一个不断学习的过程 1878

Java 集合 Stream 流操作的基本使用教程

可以看到,stream 流操作并没有什么使用难度,但如果不熟悉 Lambda 表达式开发和函数引用,则使用起来可能会稍微吃力些。置于并发流的使用,只需要使用集合的方法,就可以获得一个并发流,在编写代码上基本和同步流没什么区别,因此学会上面的基本用法基本足够了,实际使用过程中,根据实际情况决定如何使用即可。

weixin_74412978的博客 692

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java集合——聚合操作(Stream流)

Stream接口,JDK8新增接口,该接口,并结合Lambda表达式的优势进一步简化集合、数组中元素的查找、过滤、转换等操作,这一新功能叫做聚合操作。

清晨的博客 5733

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java Stream 流:让集合操作更优雅高效

Java8 Stream流为集合操作提供了简洁高效的处理方式。它通过中间操作(filter、map、sorted等)和终端操作(collect、count等)实现链式数据处理,具有惰性执行、可并行化等特点。Stream流可从集合、数组等数据源创建,支持复杂的数据转换和聚合操作。实际应用中需要注意避免修改数据源、线程安全等问题。合理使用Stream能显著提升代码可读性和开发效率,是Java开发中处理集合数据的利器。

Java是世界上最好的语言 1021

Java8中Stream流对集合操作

之前学习了一点,无奈过了段时间还是会忘记怎么使用,然后去搜索。索性就写成实例,下次再忘记可以迅速回忆起来。 Student.java public class Student { private String name; private int age; private List<Double> grade;//四门课程成绩 private double all;//综合分数 } 初始化 List<Student> studentLis

打呼噜的星 354

Java8 Stream流如何操作集合,一文带你了解!

Java8 Stream集合流操作基础了解

一个Tester的博客 1358

【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作

Java 8引入了Lambda函数式编程和Stream流这两个重要特性。Lambda表达式简化了匿名内部类的使用,提高了代码的表达能力和可读性。Stream流提供了便捷高效的方式对集合数据进行操作,支持延迟执行、函数式编程和并行处理,可以对数据进行过滤、映射、排序、聚合等操作。这两个特性的引入使得Java编程更加灵活高效,极大地提升了开发效率和代码质量。Lambda函数式编程和Stream流已经成为Java编程中不可或缺的重要特性,广泛应用于集合操作、并行处理等场景。

peng_YuJun的博客 1322

Java8新特性——Stream流:不同于IO流的流,操作集合数据

文章目录1、什么是Stream流1、认识Stream流2、Stream流和Collection的区别3、流的获取方式4、流操作和管道 1、什么是Stream流 1、认识Stream流 2、Stream流和Collection的区别 在Package java.util.stream这个包中引入的关键类是stream。 类Stream、IntStream、LongStream和DoubleStream是对象上的流以及原始int、long和double类型。流在几个方面与集合不同: 没有存储。 流不是存储元素

LH is programming hard 2653

Java8 Stream流:高效集合操作指南

详解Java中的Stream流

2301_80313139的博客 1069

如何使两个list集合合并_Java Stream 流的合并操作

1. 前言Java Stream Api[1] 提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作。今天我们来看看如何合并 Stream 流。2. Stream 流的合并Stream 流合并的前提是元素的类型能够一致。2.1 concat最简单合并流的方法是通过 Stream.concat() 静态方法:Streamstream=Stream.of(1...

weixin_39622901的博客 6734

Java 8 Stream流深度解析:让集合操作优雅如诗

Java 8 Stream流深度解析摘要 Stream是Java 8引入的声明式集合处理API,通过流水线操作链(中间操作+终端操作)实现优雅的数据处理。相比传统循环,Stream代码量减少60%,逻辑更清晰。核心特性包括无存储、懒执行和不可逆性。提供丰富的中间操作(filter/map/sorted等)和终端操作(collect/forEach等),支持并行流加速计算(需注意线程安全)。适用于CPU密集型任务,但对I/O密集型操作效果有限。通过数值流优化、方法引用等技巧,可进一步提升性能与可读性,是现代化

m0_75126572的博客 674

如何使两个list集合合并_Java Stream 流如何进行合并操作

1. 前言Java Stream Api 提供了很多有用的 Api 让我们很方便将集合或者多个同类型的元素转换为流进行操作。今天我们来看看如何合并 Stream 流。2. Stream 流的合并Stream 流合并的前提是元素的类型能够一致。2.1 concat最简单合并流的方法是通过 Stream.concat() 静态方法:Stream stream = Stream.of(1, 2, 3);...

weixin_33391446的博客 1万+

Java中的流(Stream)以及它们在集合操作中的作用和例子

通过使用流,你可以对集合数据进行各种复杂的操作,如过滤、映射、排序、聚合等,而无需编写大量的迭代代码。然后,我们使用了流的filter方法来找出所有的偶数,map方法将每个数字乘以2,以及sorted方法进行排序。需要注意的是,流操作不会修改原始集合,而是返回一个新的集合或结果。这是因为流操作是懒加载的,而且流操作本身是无状态的。简化集合操作:通过链式调用的方式,你可以将多个操作组合在一起,形成一个流畅的操作序列。延迟执行:流的操作是懒加载的,只有在需要结果时才会执行操作,这有助于提高程序的性能。

emma20080101的博客 477

Java Stream 流:优雅操作集合与数组的新方式

本文围绕 Java 8 Stream 流展开,先阐释其作为集合与数组处理工具的核心特性 —— 声明式编程、链式操作与惰性执行,明确 “获取流 - 中间操作 - 终结操作” 的使用流程;接着详细介绍从单列集合、双列集合、数组及零散数据获取 Stream 流的 4 种方式;随后结合案例梳理过滤、限制、去重、类型转换等中间操作,以及遍历、统计、数组 / 集合收集等终结操作的用法;最后提及流仅用一次、不修改源数据等注意事项。全文旨在帮助读者掌握 Stream 流,实现集合与数组操作的简洁化、高效化。

Shabbt的博客 1069
上一篇: linux swap分区调整
下一篇: quartz CronExpression表达式使用详解
缺陷代码
博客等级 码龄21年 76粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值