Lambda表达式解决Java行为传递啰嗦问题,语法为(参数)->{方法体},可省略括号、大括号和return;依托函数式接口(如Predicate、Function等);支持方法引用和Stream链式操作。

Java Lambda 表达式系统梳理,核心是抓住“为什么用、怎么写、在哪用、怎么简”四条主线,不堆概念,直奔实用。
为什么需要 Lambda 表达式
它解决的是 Java 长期存在的“行为传递太啰嗦”问题。以前要传一段逻辑(比如排序规则、线程任务、集合过滤条件),必须套一层匿名内部类,光模板代码就占大半,真正业务逻辑反而被埋没。
- 开启线程:不用再写
new Runnable() { public void run() { ... } } - 集合排序:不用再写
new Comparator<String>() { public int compare(...) { ... } } - 列表过滤:不用为一个简单条件单独定义类或方法
Lambda 的本质,就是把“做什么”从“怎么包装它”里解放出来。
Lambda 的语法结构与省略规则
标准写法是:(参数) -> { 方法体 }。三部分缺一不可,但多数时候能省:
立即学习“Java免费学习笔记(深入)”;
- 无参数 → 必须写
(),不能省(如() -> System.out.println("hi")) - 单参数且类型可推断 → 括号可省(如
s -> s.length()等价于(String s) -> s.length()) - 方法体只有一行表达式 → 大括号、
return全部省略(s -> s.toUpperCase()) - 方法体是多行语句或含控制流 → 必须加
{},有返回值时需显式return
必须理解的函数式接口
Lambda 不是独立存在的,它背后必须有一个**只含一个抽象方法**的接口——即函数式接口。Java 把常用场景都封装好了:
-
Predicate<T>:输入 T,返回 boolean —— 适合
filter(如s -> s.length() > 5) -
Function<T, R>:输入 T,输出 R —— 适合
map(如s -> s.trim()) -
Consumer<T>:输入 T,无返回 —— 适合
forEach(如System.out::println) -
Supplier<T>:无输入,输出 T —— 适合延迟创建对象(如
() -> new Date()) - Comparator<T> 和 Runnable 这些老接口也自动成为函数式接口
进阶提效:方法引用和常见组合
当 Lambda 只是调用一个已有方法,直接用 :: 替代,更清晰:
-
System.out::println←→x -> System.out.println(x) -
String::length←→s -> s.length() -
Integer::compareTo←→(a, b) -> a.compareTo(b) -
ArrayList::new←→() -> new ArrayList<>()
搭配 Stream 使用才是 Lambda 的主战场:一行代码完成过滤、转换、聚合,比如
list.stream().filter(s -> s.startsWith("A")).map(String::toUpperCase).collect(Collectors.toList())


















