Lambda表达式通关关键在于建立“接口→抽象方法→Lambda写法→实际场景”认知链,需先识别函数式接口(如Runnable、Consumer等),再按场景动手写三类典型Lambda并掌握省略规则,最后结合Stream API实战与方法引用优化。

Java Lambda 表达式通关演练,关键不在死记语法,而在于建立“接口→抽象方法→Lambda写法→实际场景”的连贯认知链。练对方向,几小时就能打通任督二脉。
紧扣函数式接口,先认准“能用Lambda的地方”
Lambda不是万能钥匙,它只能赋值给函数式接口(有且仅有一个抽象方法的接口)。练之前,必须能一眼识别常见接口是否符合要求:
-
Runnable:只有一个
run(),无参无返回 → 适合启动线程、延时任务 -
Consumer
:只有一个 accept(T),有参无返回 → 适合遍历、打印、消费数据 -
Predicate
:只有一个 test(T),有参返回boolean→ 适合过滤、校验 -
Function
:只有一个 apply(T),有参有返回 → 适合转换、映射(如转大写、转对象) -
Supplier
:只有一个 get(),无参有返回 → 适合延迟生成、默认值提供
看到接口就问自己:“它有几个抽象方法?我能把它替换成() -> {...}吗?”——这是通关第一关。
动手写三类典型Lambda,吃透省略规则
别背规则,直接照着场景写,省略自然就熟了:
立即学习“Java免费学习笔记(深入)”;
-
无参无返回(如 Runnable):
完整写法:() -> { System.out.println("启动"); }
常用简写:() -> System.out.println("启动")(单行自动省{}和分号) -
单参无返回(如 Consumer):
完整写法:(s) -> { System.out.println(s); }
常用简写:s -> System.out.println(s)(单参可省括号) -
双参有返回(如 Comparator 或 Function):
完整写法:(a, b) -> { return a.length() - b.length(); }
常用简写:(a, b) -> a.length() - b.length()(单行自动省{}和return)
搭配Stream API实战,体会真正价值
单独写Lambda意义不大,和Stream一起用才见威力。拿一个List
-
遍历:
list.forEach(s -> System.out.print(s + " ")) -
筛选:
list.stream().filter(s -> s.startsWith("J")).collect(Collectors.toList()) -
转换:
list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList()) -
聚合:
long count = list.stream().filter(s -> s.length() > 3).count()
每写一行,都回头对照:左边是哪个函数式接口?右边Lambda对应它的哪个抽象方法?参数类型是谁推的?返回值是否匹配?
进阶一步:用方法引用替代简单Lambda
当Lambda只调用一个已有方法时,直接升级为方法引用,更简洁也更语义化:
-
list.forEach(s -> System.out.println(s))→list.forEach(System.out::println) -
list.stream().map(s -> s.toUpperCase())→list.stream().map(String::toUpperCase) -
list.sort((a, b) -> a.compareTo(b))→list.sort(String::compareTo)
记住口诀:“能写::,就不写->”。只要看到Lambda里只有一句xxx.yyy(...),就试试改成xxx::yyy。


















