在 Java 中,匿名函数(也称为匿名类或 lambda 表达式)是一种没有显式名称的函数,主要用于简化代码编写,特别是在处理函数式接口时非常有用。以下是关于 Java 匿名函数的详细解析:
1. 匿名类(Anonymous Classes)
匿名类是没有名称的局部内部类,通常用于创建只需要使用一次的类实例。它可以实现接口或继承类。
示例:实现接口
// 定义一个函数式接口
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
// 使用匿名类实现Greeting接口
Greeting greeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello, World!");
}
};
greeting.sayHello(); // 输出: Hello, World!
}
}
特点:
- 没有类名,直接通过
new 接口/父类()创建实例 - 必须实现接口的所有方法或重写父类的方法
- 通常用于创建简单的类实例,避免单独定义类
2. Lambda 表达式(Java 8+)
Lambda 表达式是 Java 8 引入的函数式编程特性,是匿名函数的简化形式,只能用于函数式接口(只有一个抽象方法的接口)。
基本语法:
(参数列表) -> { 方法体 }
示例:简化匿名类
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
// 使用lambda表达式实现Greeting接口
Greeting greeting = () -> System.out.println("Hello, Lambda!");
greeting.sayHello(); // 输出: Hello, Lambda!
}
}
带参数的 Lambda 表达式:
interface Calculator {
int calculate(int a, int b);
}
public class Main {
public static void main(String[] args) {
// 加法操作
Calculator addition = (a, b) -> a + b;
System.out.println(addition.calculate(3, 5)); // 输出: 8
// 乘法操作
Calculator multiplication = (a, b) -> a * b;
System.out.println(multiplication.calculate(3, 5)); // 输出: 15
}
}
Lambda 表达式的简化规则:
- 若参数列表只有一个参数,可省略括号:
x -> x * 2 - 若方法体只有一条语句,可省略大括号和
return:(a, b) -> a + b - 可显式指定参数类型:
(int a, int b) -> a + b
3. 匿名函数的应用场景
- 事件监听
button.addActionListener(e -> System.out.println("按钮被点击"));
- 集合操作(Stream API)
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name)); // 遍历集合
// 过滤并排序
List<String> filtered = names.stream()
.filter(name -> name.length() > 3)
.sorted((a, b) -> a.compareTo(b))
.collect(Collectors.toList());
- 线程创建
// 传统方式
new Thread(new Runnable() {
public void run() {
System.out.println("线程运行中");
}
}).start();
// Lambda方式
new Thread(() -> System.out.println("线程运行中")).start();
4. 匿名类与 Lambda 表达式的区别
| 特性 | 匿名类 | Lambda 表达式 |
|---|---|---|
| 适用范围 | 任何接口或类 | 仅函数式接口 |
| this 指向 | 指向匿名类实例 | 指向外部类实例 |
| 变量访问 | 可访问非 final 变量(但不推荐修改) | 只能访问 effectively final 变量 |
| 代码简洁性 | 较繁琐 | 更简洁 |
5. 注意事项
- Lambda 表达式只能用于函数式接口(可使用
@FunctionalInterface注解验证) - 在 Lambda 中访问外部变量时,变量必须是 final 或 effectively final(即赋值后不再修改)
- 复杂逻辑建议使用普通方法或匿名类,避免 Lambda 表达式过于冗长影响可读性
通过使用匿名函数,可以显著简化代码,尤其是在处理回调、事件处理和集合操作时,使代码更加简洁易读。
9185

被折叠的 条评论
为什么被折叠?



