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

相关推荐
qq_5895681039 分钟前
java学习笔记,包括idea快捷键
java·ide·intellij-idea
淘矿人1 小时前
从0到1:用Claude启动你的第一个项目
开发语言·人工智能·git·python·github·php·pygame
cany10002 小时前
C++ -- 模板的声明和定义
开发语言·c++
澈2072 小时前
深耕进阶 Day1:C 与 C++ 核心差异 + C++ 入门基石
c语言·开发语言·c++
小怪吴吴2 小时前
idea 开发Android
android·java·intellij-idea
嘻嘻哈哈樱桃2 小时前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
Felven2 小时前
C. Need More Arrays
c语言·开发语言
一次旅行2 小时前
IDEA安装CC GUI新手指南
java·ide·intellij-idea
love530love2 小时前
Podman Machine 虚拟硬盘迁移实战二:用 Junction 把 vhdx 从 C 盘搬到其他盘
c语言·开发语言·人工智能·windows·wsl·podman·podman machine
超梦dasgg2 小时前
Spring AI 智能航空助手项目实战
java·人工智能·后端·spring·ai编程