Lambda是Java 8为支持“行为参数化”引入的语法糖,核心是函数式接口、参数→逻辑、类型推断;它简化匿名内部类,聚焦动作本身,如Thread(() -> println("干活")),并可通过四大接口(Runnable、Consumer、Predicate、Function)结合Stream快速上手实践。

直接上手,边写边理解,比死记语法更有效。Lambda 不是新语言,而是 Java 对“把行为当数据用”这件事的语法支持,核心就三点:函数式接口、参数→逻辑、类型能推就推。
先搞懂它为什么存在
Java 8 之前,想传一段逻辑(比如排序规则、线程要干啥),得写匿名内部类——一堆模板代码包裹一行真正有用的逻辑。Lambda 就是把这层“包装纸”撕掉,只留核心动作。
- 传统写法:
new Thread(new Runnable() { public void run() { System.out.println("干活"); } }); - Lambda 写法:
new Thread(() -> System.out.println("干活"));
你关注的不是“怎么造一个 Runnable 对象”,而是“让它干啥”。这就是行为参数化的起点。
从最常用的函数式接口开始练
别一上来啃 @FunctionalInterface 注解或自己定义接口。先熟用 JDK 提供的四个基础接口,它们覆盖 90% 场景:
-
Runnable:无参无返回 →
() -> doSomething()(线程、定时任务) -
Consumer
:消费一个值,不返回 → s -> System.out.println(s)(遍历打印、日志记录) -
Predicate
:判断真假 → s -> s.length() > 5(过滤条件) -
Function
:输入 T,输出 R → str -> str.toUpperCase()(转换、映射)
每个接口配一个 Stream 操作练:forEach(Consumer)、filter(Predicate)、map(Function)、sorted(Comparator,也是函数式接口)。
动手改写旧代码,而不是空学语法
找一段你写过的集合处理或事件监听代码,用 Lambda 替换掉匿名内部类。例如:
- 把
list.sort(new Comparator改成() { ... }) list.sort((a, b) -> a.compareTo(b)) - 把
button.addActionListener(new ActionListener() { ... })改成button.addActionListener(e -> handle())
过程中注意编译器报错——它会告诉你“期待一个函数式接口”,这时你就知道该用哪个接口、参数怎么写。错误就是最好的老师。
掌握省略规则和类型推断
语法看着多,其实就几条实用规则:
- 只有一个参数,括号可省:
x -> x * 2等价于(x) -> x * 2 - 只有一行表达式,大括号和 return 可省:
(a,b) -> a + b - 参数类型通常不用写,编译器能猜出来:
list.filter(s -> s.startsWith("A"))中的s自动是String - 但无参数时,括号不能省:
() -> doWork(),不是-> doWork()
写的时候先写全((String s) -> { return s.trim(); }),跑通后再一步步删掉能省的部分,感受推断过程。
再往后自然延伸:方法引用和 Stream 链式调用
等你能熟练写出 list.stream().filter(x -> x > 0).map(x -> x * 2).collect(...),就可以升级了:
- 把
x -> x.toString()换成Object::toString(方法引用) - 把
s -> s.length()换成String::length - 尝试
parallelStream()和reduce处理更复杂聚合
这时候你已经不是在学 Lambda,而是在用它组织清晰的数据流逻辑了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











