Java Lambda 表达式与 Stream API 全解析:从基础到进阶

以下是对您博客内容的优化版本,在保留原有核心内容的基础上,补充了Lambda表达式及Stream API的完整方法体系,并通过结构化排版和扩展说明提升可读性。

Java Lambda表达式与Stream API全解析:从基础到进阶

一、Lambda表达式与Stream API基础

Lambda表达式是Java 8引入的函数式编程特性,配合Stream API可高效处理集合数据。其核心优势在于:

  • 减少冗余代码,提升可读性
  • 支持并行处理,优化性能
  • 链式调用实现流式数据处理
二、Stream API核心方法详解

以下以Student类为例(类定义同原博客),展示Stream API的完整方法体系:

1. 数据转换(Map系列)

作用:将流中元素转换为新类型。

// 基础map:转换元素类型
List<Integer> ages = students.stream().map(Student::getAge)  // 提取年龄,返回Stream<Integer>.collect(Collectors.toList());  // [18, 26, 30, 10, 10]// 特化map:返回基本类型流
IntStream ageStream = students.stream().mapToInt(Student::getAge);  // 直接返回IntStream,避免装箱开销// flatMap:合并多层流(处理嵌套集合)
List<Integer> allScores = students.stream().flatMap(student -> student.getCourses().stream())  // 将每个学生的课程流合并为一个流.collect(Collectors.toList());  // 假设getCourses()返回List<Integer>

注意map处理单个元素转换,flatMap处理多层集合展开(如将Stream<List<T>>转为Stream<T>)。

2. 数据过滤与去重

filter:按条件筛选元素。

List<Student> adultStudents = students.stream().filter(student -> student.getAge() > 18)  // 保留年龄>18的学生.collect(Collectors.toList());

distinct:根据元素equalshashCode去重。

List<Student> uniqueStudents = students.stream().distinct()  // 去重,需Student重写equals和hashCode.collect(Collectors.toList());

3. 排序与限制

sorted:排序(支持自定义比较器)。

// 自然排序(年龄升序)
List<Integer> sortedAges = students.stream().map(Student::getAge).sorted()  // 等价于sorted(Comparator.naturalOrder()).collect(Collectors.toList());  // [10, 10, 18, 26, 30]// 自定义排序(年龄降序)
List<Student> sortedStudents = students.stream().sorted((s1, s2) -> s2.getAge() - s1.getAge()).collect(Collectors.toList());

limit/skip:限制流长度(limit取前n个,skip跳过前n个)。

List<Student> firstTwo = students.stream().limit(2)  // 取前2个学生.collect(Collectors.toList());

4. 聚合与归约(Reduce)

reduce:将流中元素聚合为单个结果。

// 计算年龄总和
int totalAge = students.stream().mapToInt(Student::getAge).sum();  // 更简洁的归约方式,等价于:// .reduce(0, (sum, age) -> sum + age);// 复杂归约:找出年龄最大的学生
Student oldestStudent = students.stream().reduce((s1, s2) -> s1.getAge() > s2.getAge() ? s1 : s2).orElse(null);

5. 查找与匹配

findFirst/findAny:查找第一个/任意元素(并行流中findAny效率更高)。

int firstAdultAge = students.stream().filter(s -> s.getAge() > 18).findFirst().map(Student::getAge).orElse(0);  // 若无可选元素,返回0

allMatch/anyMatch/noneMatch:判断流中元素是否满足条件。

boolean hasTeenager = students.stream().anyMatch(s -> s.getAge() < 20);  // 是否有青少年

6. 消费与调试(Peek)

peek:对流中元素执行操作(常用于调试)。

List<Student> debugList = students.stream().peek(s -> System.out.println("处理学生:" + s.getName())).collect(Collectors.toList());

7. 其他实用方法

count:统计元素数量。

long studentCount = students.stream().count();

collect:将流转换为集合/Map等(配合Collectors工具类)。

// 按年龄分组
Map<Integer, List<Student>> studentsByAge = students.stream().collect(Collectors.groupingBy(Student::getAge));// 提取姓名列表
List<String> names = students.stream().map(Student::getName).collect(Collectors.toList());

三、Lambda表达式进阶用法

1. 方法引用(Method Reference)

简化Lambda表达式,直接引用已有方法。

// 等价于 x -> x.getAge()
students.stream().map(Student::getAge);// 静态方法引用
List<String> names = students.stream().map(Student::getName).collect(Collectors.toList());
2. 构造器引用
// 将Integer列表转为Student对象列表(假设Student有Integer参数的构造器)
List<Student> studentList = ages.stream().map(Student::new)  // 等价于 x -> new Student(x).collect(Collectors.toList());

四、性能优化与注意事项

  1. 惰性求值:Stream操作分为惰性(filter/map)和及早(collect/reduce),需调用及早操作才会执行。
  2. 并行流:大数据量时使用parallelStream()提升性能,但需注意线程安全。
  3. 装箱开销:使用mapToInt/mapToLong等特化方法避免自动装箱。

五、完整示例:综合应用

// 需求:统计年龄>20的学生姓名,按年龄降序排列,取前3个
List<String> result = students.stream().filter(s -> s.getAge() > 20)       // 过滤年龄>20.sorted((s1, s2) -> s2.getAge() - s1.getAge())  // 年龄降序.limit(3)                           // 取前3个.map(Student::getName)              // 提取姓名.collect(Collectors.toList());      // 转换为列表

通过以上优化,内容覆盖了Lambda与Stream API的核心方法,并补充了进阶用法和性能建议,结构更清晰,示例更全面。如需进一步扩展,可加入并行流对比、自定义Collector实现等深度内容。

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

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

相关文章

Let’s Encrypt(乐此加密) 免费SSL证书申请

一、前言 腾讯云、阿里云等平台都支持免费的SSL证书申请&#xff0c;但只支持单域名SSL证书申请&#xff0c;不支持泛域名证书申请&#xff0c;而且每年只有20张免费证书额度&#xff0c;自2024年4月25日之起免费申请的证书只有3个月有效期。域名比较多的情况下&#xff0c;更新…

SQLite3 性能优化

在嵌入式开发和轻量级应用场景中&#xff0c;SQLite3 作为轻量级数据库引擎&#xff0c;凭借其无需独立服务器、部署便捷等特点被广泛应用。然而&#xff0c;当面对大量数据的高速读写需求时&#xff0c;默认配置下的 SQLite3 性能往往难以满足要求。本文将从数据库配置调整、W…

零基础设计模式——行为型模式 - 状态模式

第四部分&#xff1a;行为型模式 - 状态模式 (State Pattern) 我们继续学习行为型模式&#xff0c;接下来是状态模式。这个模式允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来就像是改变了它的类。 核心思想&#xff1a;允许一个对象在其内部状态改变时改…

面向对象面试题集合

前言 记录面向对象面试题相关内容&#xff0c;方便复习及查漏补缺 题1.简述面向对象&#xff1f;主要特征是什么&#xff1f; 面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种以“对象”为核心的编程范式&#xff0c;通过将现实…

二十一、【用户管理与权限 - 篇三】角色管理:前端角色列表与 CRUD 实现

【用户管理与权限 - 篇三】角色管理:前端角色列表与 CRUD 实现 前言准备工作第一部分:更新 API 服务以包含角色管理第二部分:添加角色管理页面的路由和侧边栏入口第三部分:实现角色列表页面第四部分:实现角色表单对话框组件第五部分:全面测试总结前言 一个完善的权限系统…

Objective-c protocol 练习

题目描述&#xff1a; 请使用 Objective-C 中的 protocol 协议机制&#xff0c;实现一个简易的门禁控制系统。 系统包含两个类&#xff1a; AccessControlSystem —— 门禁系统&#xff0c;用于执行开门操作&#xff1b;Admin —— 实现权限判断逻辑的管理员。 要求如下&am…

科技创新赋能产业创新,双轮驱动助力新疆高质量发展!

在新疆维吾尔自治区成立70周年之际&#xff0c;中国产学研合作促进会于6月14日在乌鲁木齐举办“天山对话&#xff1a;推动新疆科技创新与产业创新”盛会。多位院士、专家、学者及企业代表齐聚一堂&#xff0c;探寻推动新疆科技创新和产业创新的新路径、新动能。活动现场&#x…

C#最佳实践:推荐使用 nameof 而非硬编码名称

C#最佳实践:推荐使用 nameof 而非硬编码名称 在 C# 编程领域,代码的可维护性、健壮性和可读性是衡量程序质量的重要指标。在日常开发中,我们常常会遇到需要引用类型、成员或变量名称的场景,比如在抛出异常时指定错误相关的变量名、在日志记录中标记关键元素名称等。传统的…

vue3 iframe 跨域-通讯

一、基础嵌套方法 直接在 HTML 中使用 <iframe> 标签指定 src 属性&#xff1a; <iframe src"https://目标网址.com" width"800" height"600"></iframe>‌限制‌&#xff1a;若目标网站设置了 X-Frame-Options 响应头&#x…

Iceberg与Hive集成深度

一、Iceberg在Hive中的ACID事务实现与实战 1.1 传统Hive的事务局限性 Hive原生仅支持非事务表&#xff08;Non-ACID&#xff09;&#xff0c;存在以下痛点&#xff1a; 不支持行级更新/删除并发写入时数据一致性无法保证无事务回滚机制历史版本查询需手动实现 1.2 Iceberg为…

深入剖析 Celery:分布式异步任务处理的利器

本文在创作过程中借助 AI 工具辅助资料整理与内容优化。图片来源网络。 文章目录 引言一、Celery 概述1.1 Celery 的定义和作用1.2 Celery 的应用场景 二、Celery 架构分析2.1 Celery 的整体架构2.2 消息中间件&#xff08;Broker&#xff09;2.3 任务队列&#xff08;Task Que…

Flask应用中处理异步事件(后台线程+事件循环)的方法(2)

在上一节&#xff0c;我们讲述了最简单最基础的后线程的建立&#xff0c;现在我们将进行拓展 Flask应用中处理异步事件&#xff08;后台线程事件循环&#xff09;的方法&#xff08;1&#xff09; 在我们的实际应用当中&#xff0c;我们需要定义三个东西 一个多线程的信号旗&am…

C++(面向对象编程)

思维导图 面向对象 1.面向对象思想 概念&#xff1a;面向对象编程&#xff08;OOP&#xff09;是一种以对象为基础的编程范式&#xff0c;强调将数据和操作数据的方法封装在一起。这就是上篇文章讲过的。面向过程是以“怎么解决问题”为核心&#xff0c;而面向对象思想在于“谁…

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,Error: “The server selected protocol version TLS10 is not accepted by client preferences [TLS13&#xff0c;TLS12]”. ClientConnectionId:d5fd8d69-ae88-4055-9f6d-6e8515224ce2】。 基本上就是…

【三大前端语言之一】交互:JavaScript详解

【三大前端语言之一】交互&#xff1a;JavaScript详解 在学习完HTML和CSS之后&#xff0c;最后一门前端语言——JavaScript&#xff0c;是重中之重。HTML负责页面结构&#xff0c;CSS负责页面样式&#xff0c;而JavaScript则赋予网页“生命”&#xff0c;让网页可以动起来、响…

LangChain面试内容整理-知识点12:检索器(Retriever)接口与实现

在LangChain中,检索器(Retriever)是一个抽象接口,负责根据用户查询从数据源中检索相关文档。可以把Retriever理解为“搜索工具”:给它一个未经结构化的查询文本(如用户问题),它返回一组与之相关的 Document 对象。内部可以基于向量相似度、数据库查询、甚至网络搜索。 …

LLVM前端和优化层

文章目录 LLVM ArchitectueLLVM 前端Lexical Analysis词法分析Syntactic analysis 语法分析Syntactic Analyze语义分析 LLVM 优化层Pass 基础概念Pass 依赖关系Pass API 总结 LLVM Architectue LLVM 前端 LLVM 的前端其实是把源代码也就是 C、C、Python 这些高级语言变为编译器…

工作流和Agent 的区别与联系

工作流和智能体可能让人混淆的地方就是他们都可能有大模型的加持&#xff0c;都可能有工具的加入供大模型调用&#xff0c;本文做一下对比和联系 工作流 (Workflow) 定义&#xff1a; 工作流是一系列预定义、结构化且可重复的步骤或任务&#xff0c;旨在完成特定的业务目标或解…

leetcode--用StringBulider反转字符串单词的巧妙解法

反转字符串中的单词 这道题理想中的操作方式就是先去除前导和尾随空格&#xff0c;之后设一个尾指针&#xff0c;往前检索&#xff0c;扫到一个单词就把这个单词放到字符串的第一个位置。 很明显&#xff0c;java中我们不能直接对字符串进行修改&#xff0c;而我们想实现一个一…

连锁零售行业智慧能源管理解决方案:精准管控,让每一度电创造价值

在连锁超市、便利店等业态中&#xff0c;门店分布广、用能场景复杂、管理成本高是普遍难题。传统能源管理模式依赖人工抄表与分散管理&#xff0c;存在数据滞后、响应效率低、安全隐患难排查等问题。以某全国几千家门店的连锁便利店为例&#xff0c;其面临的挑战包括&#xff1…