引言
想象你每天点外卖要写500字的订单备注,结果有一天发现点“快速套餐”按钮就能搞定——这就是Lambda表达式的魅力!它能让你用“快餐式”代码代替冗长的写法。本文会用大白话、生活案例和代码对比,帮你彻底搞懂Java Lambda的用法!
“用更短的代码,实现一个方法”—— 专门用来简化匿名内部类的写法!
假设你有一个“点击按钮触发事件”的需求:
1. 传统写法(匿名内部类
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了!");
}
});
必须写new
、类名、方法名… 太啰嗦!
2. Lambda写
button.addActionListener(e -> System.out.println("按钮被点击了!"));
只需要保留参数和方法体,就像直接传递了一个“动作”!
(参数...) -> { 方法体 }
或者更极简版(仅限单行代码):
参数 -> 单行代码
场景 | 写法 |
---|---|
无参数 | () -> System.out.println("Hello") |
一个参数 | x -> x * 2 (可省略参数括号) |
多行代码 | (x, y) -> { return x + y; } |
Lambda不是魔法,背后需要一个只有一个抽象方法的接口(称为函数式接口),比如:Runnable
、Comparator
。
// 必须是只有一个抽象方法的接口(可以加@FunctionalInterface注解标记)
@FunctionalInterface
interface Greeting {
void sayHello(String name);
}
// 使用Lambda实现
Greeting g = name -> System.out.println("你好," + name);
g.sayHello("张三"); // 输出:你好,张三
List list = Arrays.asList("Java", "Python", "C++");
// 传统for循环 vs Lambda优雅版
list.forEach(s -> System.out.println(s));
// 老写法:需要new Runnable()...
new Thread(() -> System.out.println("线程运行中")).start();
List numbers = Arrays.asList(1, 2, 3, 4, 5);
List evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// 输出:[2, 4]
List words = Arrays.asList("apple", "banana", "cherry");
words.sort((a, b) -> a.length() - b.length());
// 按字符串长度排序:["apple", "cherry", "banana"]
Lambda内部使用的外部局部变量必须是final
或等效final(不被修改的)。
int count = 0;
list.forEach(s -> {
// count++; // 报错!不能修改外部变量
System.out.println(count); // 但可以读取
});
如果Lambda只是调用已有方法,可以进一步简写,例如:
list.forEach(System.out::println); // 等价于 s -> System.out.println(s)
将以下匿名内部类改为Lambda:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("运行线程");
}
}).start();
用Lambda对一个List
进行降序排序。
答案在文末
总结
Lambda就像代码界的“快捷键”,学会后能让你的Java代码更简洁高效。重点记住两点: 1️⃣ 它的本质是简化函数式接口的实现
2️⃣ 常见场景:集合操作、线程、排序
刚开始用可能会有点不习惯,但写多了绝对会上瘾!如果你觉得文章有用,点赞收藏支持下博主吧~
练习题答案:
new Thread(() -> System.out.println("运行线程")).start();
list.sort((a, b) -> b - a);