lambda表达式本质是为简化匿名内部类而生,只适用于有且仅一个抽象方法的函数式接口;常见写法包括无参、单参类型可推断、双参单表达式三种;使用时需注意参数类型推断、大括号与return省略规则及局部变量必须为effectively final。

直接上手学 Lambda 表达式,关键不是背语法,而是理解它“为什么存在”和“用在哪儿”。它本质是为简化匿名内部类而生,只对函数式接口有效——这是你起步前必须踩稳的第一步。
先搞懂函数式接口:Lambda 的唯一入口
函数式接口 = 有且仅有一个抽象方法的接口(@FunctionalInterface 是可选但强烈建议的编译检查)。它不是抽象类,不能有两个待实现的方法。
- Java 自带的典型例子:Runnable(无参无返回)、Comparator(两个参数,返回 int)、Predicate
(接收 T,返回 boolean) - 自定义时只要写一个抽象方法,加 default 或 static 方法完全不影响它成为函数式接口
- 如果误加第二个抽象方法,编译器会报错,Lambda 就无法使用
从最简场景开始写:三类高频写法
别一上来就记所有省略规则。先掌握这三种最常用、最直观的形态:
- 无参数:比如启动线程 → () -> System.out.println("运行中")
- 单参数且类型可推断:比如遍历集合 → name -> System.out.println(name)(括号省了,类型也省了)
- 双参数+单表达式:比如排序 → (a, b) -> a.length() - b.length()(大括号和 return 全部省略)
动手练几个真实片段:边写边建立直觉
打开 IDE,复制粘贴以下几行,逐个运行,观察效果和错误提示:
- 用 Lambda 替换 Runnable:new Thread(() -> System.out.println("Hello")).start();
- 用 Lambda 遍历 List:List.of("a", "bb", "ccc").forEach(s -> System.out.print(s + " "));
- 用 Lambda 筛选集合:List
nums = List.of(1, 2, 3, 4); nums.stream().filter(x -> x % 2 == 0).forEach(System.out::println);
注意那些容易卡住的细节
初学时几个坑反复出现,提前避开能少走弯路:
- 参数类型不写通常没问题,但若上下文无法推断(比如方法重载),就得显式声明,例如 (String s) -> s.toUpperCase()
- 方法体只有一句表达式时,return 和 {} 可省;但凡有两行语句,就必须加 {},且 return 不能省(除非是 void 方法)
- Lambda 里访问外部局部变量,该变量必须是 effectively final(事实上的常量)——即定义后没被重新赋值过
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











