Java Lambda表达式
Java Lambda 表达式
Lambda 表达式是 Java 8 引入的一个重要特性,它提供了一种更简洁的方式来表示匿名函数(anonymous function),使得函数式编程在 Java 中变得更加容易。
1. 基本语法
Lambda 表达式的基本语法如下:
(parameters) -> expression
或
(parameters) -> { statements; }
2. 主要特点
- 简洁性:比匿名内部类更简洁
- 函数式接口:Lambda 表达式需要与函数式接口(只有一个抽象方法的接口)配合使用
- 类型推断:Java 编译器可以推断参数类型
3. 示例
3.1 无参数
() -> System.out.println("Hello Lambda!")
3.2 单个参数
x -> x * x
3.3 多个参数
(int x, int y) -> x + y
3.4 带代码块
(String s) -> {System.out.println("Input: " + s);return s.length();
}
4. 常见用法
4.1 与函数式接口配合
// 定义函数式接口
interface Greeting {void sayHello(String name);
}// 使用Lambda表达式
Greeting greet = name -> System.out.println("Hello, " + name);
greet.sayHello("Alice");
4.2 集合操作
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 使用Lambda表达式遍历
names.forEach(name -> System.out.println(name));// 使用方法引用
names.forEach(System.out::println);
4.3 线程创建
// 传统方式
new Thread(new Runnable() {public void run() {System.out.println("Running");}
}).start();// Lambda方式
new Thread(() -> System.out.println("Running")).start();
5. 方法引用
Lambda 表达式的一种简写形式,有四种类型:
- 静态方法引用:
ClassName::staticMethod
- 实例方法引用:
instance::method
- 特定类型的任意对象的实例方法引用:
ClassName::method
- 构造方法引用:
ClassName::new
示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 等同于 name -> System.out.println(name)
names.forEach(System.out::println);// 等同于 s -> s.length()
names.stream().map(String::length).forEach(System.out::println);
6. 变量作用域
Lambda 表达式可以访问:
- 局部变量(必须是 final 或 effectively final)
- 实例变量和静态变量
- 方法参数
示例:
int num = 10; // effectively final
Runnable r = () -> System.out.println(num); // 合法
// num = 20; // 如果取消注释会导致编译错误