当前位置: 首页 > news >正文

Lambda 表达式 —— Java 8 的函数式编程利器

同学们好,今天我们学习 Java 中一个非常重要的特性 ——Lambda 表达式。它让 Java 代码变得更简洁、更灵活,是学习 Stream API、函数式编程的基础。

一、为什么要引入 Lambda?

先看一个例子:我们想创建一个新线程,在控制台打印“Hello”。

传统写法(匿名内部类):

Runnable接口只有一个抽象方法run(),我们却不得不写一堆“模板代码”。Lambda 表达式就是为了简化这种“只有一个抽象方法的接口”的实现方式。

二、Lambda 表达式的语法

(参数列表) -> { 方法体 }
  • 参数列表:与方法参数类似,类型可省略(编译器自动推断)。

  • 箭头->:分隔参数和方法体。

  • 方法体:如果只有一条语句,可省略{}return(如果表达式本身就是返回值)。

使用lambda表达式创建对象,接口只有一个抽象方法:

要对接口进行约束(防止其他程序员添加抽象类方法)在类上加一个注解@FunctionlInterface

@FunctionlInterface 函数式接口的标识符 被函数式接口标识的接口表示只能用一个抽象类方法

但是可以有default 和static的接口

几种常见形式:

没有返回值有一个参数

没有返回值有多个参数

形参名字可以不一样

有返回值没有参数

有返回值有一个参数

有返回值有两个参数

引用普通方法

引用静态方法

使用lambda表达式进行遍历

三、函数式接口

Lambda 表达式只能用在函数式接口上。什么是函数式接口?

只有一个抽象方法的接口(可以有默认方法、静态方法)。

Java 8 为常见的函数式接口增加了@FunctionalInterface注解(可选,但建议加上,编译器会检查)。

常用的内置函数式接口(java.util.function包):

举例:

四、实战场景

1. 集合排序

2. 遍历集合(结合 forEach)

3. 事件监听(Swing/JavaFX)

4. 线程池 / 多线程

五、变量捕获(闭包)

Lambda 表达式可以访问外部的有效 final变量(即变量值不改变,或者实际没有改变)。这与匿名内部类类似。

  • 从 Java 8 开始,变量不一定要显式声明final,但必须实际不可变(effectively final)。

  • 不能修改局部变量的值(因为它是值拷贝到栈帧中)。

  • 可以修改实例变量(堆中)或静态变量。

六、方法引用 —— Lambda 的简化糖

当 Lambda 体仅仅是调用一个已存在的方法时,可以用方法引用进一步简化。

语法:类名/对象 :: 方法名

举例:

七、注意事项与常见错误

  1. Lambda 必须依赖函数式接口。不能单独写一个 Lambda,必须赋值给接口变量或用在需要接口的地方。

  2. Lambda 体内的return:如果方法体是{...}并且有返回值,必须写return;如果是单表达式,返回值自动推断。
  3. 局部变量不能修改(但可以访问)。
  4. this 关键字:Lambda 中的this指向外部类对象,而不是 Lambda 本身(与匿名内部类不同)。匿名内部类中的this指向内部类实例。
  5. 性能:Lambda 不是语法糖完全等价于匿名内部类。JVM 使用invokedynamic动态生成实现类,通常性能更优(首次调用稍慢,后续重用)。


    八、总结

Lambda 表达式就是用(参数) -> 表达式这种写法,替代啰嗦的匿名内部类,让你能把一段行为(代码块)像数据一样传递,从而写出更简洁、更灵活、可读性更高的代码。

http://www.jsqmd.com/news/588186/

相关文章:

  • 2026年远程真机测试平台选型对比与体验解析
  • 2026届毕业生推荐的六大降AI率神器实测分析
  • 高效Agent系统:大模型进阶指南,小白程序员必备收藏!
  • 嘉为蓝鲸应用发布中心V6.3发布:流自融合、安全提效,全方位护航企业级应用发布
  • 3步实现跨平台文献管理效率跃升:WPS-Zotero开源工具深度应用指南
  • 十年磨一剑:DirectX Repair如何成为最受欢迎的DLL修复工具
  • 2026届最火的六大降重复率平台实际效果
  • 数据分析与可视化:班级学生与微信好友分析
  • 终极抖音批量下载指南:5分钟搞定无水印视频批量采集
  • OneDrive顽固残留?高效彻底卸载指南:释放系统资源的实用方案
  • MouseClick:解放双手的跨平台鼠标自动化神器,告别重复点击的烦恼
  • ai一键生成node.js环境配置教程,快马平台助你跳过繁琐安装步骤
  • 【架构实战】海量数据存储:分库分表中间件实战
  • 2026年6款AI驱动的人力系统测评:谁更适合科技企业
  • 开源游戏串流新标杆:Sunshine如何实现跨设备游戏自由
  • AI辅助开发:利用快马多模型能力为红目香薰设计智能场景联动规则
  • 小白程序员必收藏!Agent工程入门指南:轻松上手大模型,抓住AI时代红利
  • DirectX Repair:从Windows XP到Windows 11的全平台DLL修复专家
  • 光伏618政策松绑!安科瑞分布式光伏监控系统解锁电站收益新高度
  • Gemma 4 现已发布: 同等规模下性能最强的开放模型
  • 直线导轨的精度对设备运行稳定性与寿命的影响
  • 3步解锁音乐宝库:qmcdump助你轻松转换QQ音乐加密文件
  • Flux Sea Studio 架构解析:理解其底层扩散模型与注意力机制设计
  • 基于stm32的心率血氧检测仪[单片机]-计算机毕业设计源码+LW文档
  • 改进二进制粒子群算法在配电网重构中的应用:基于IEEE33节点系统的功率损耗优化与动态重构程序
  • 大模型学习指南:小白程序员必备,收藏这份2026年开源大模型体系与实战教程!
  • # 005、游戏控制自动化基础:PyAutoGUI模拟键鼠与动作时序设计
  • 三维空间智能体:不是AI在看你,而是它在“理解你在哪里”
  • Godot资源解包利器:零基础掌握游戏资产提取技术
  • 西门子200Smart PLC的Modbus RTU主站自动轮询库:简化你的工业通信