Lambda表达式使用介绍
Java 8 引入了 Lambda 表达式,这是一种简洁的语法,用于表示匿名函数。Lambda 表达式使得代码更加简洁、易读,并且支持函数式编程风格。以下是 Java 8 Lambda 表达式的详细说明和示例:
1. Lambda 表达式的基本语法
Lambda 表达式的语法如下:
(parameters) -> expression
或
(parameters) -> { statements; }
parameters
:参数列表,可以为空或包含多个参数。->
:Lambda 操作符,将参数和表达式或语句分开。expression
:单个表达式,Lambda 的返回值。{ statements; }
:代码块,可以包含多条语句。
2. Lambda 表达式的特点
- 简洁性:
- 替代匿名内部类,减少模板代码。
- 类型推断:
- 编译器可以根据上下文推断参数类型。
- 函数式接口:
- Lambda 表达式需要与函数式接口(只有一个抽象方法的接口)配合使用。
3. 函数式接口
Lambda 表达式需要与 函数式接口 配合使用。函数式接口是只有一个抽象方法的接口。Java 8 提供了许多内置的函数式接口,如 Runnable
、Comparator
、Consumer
、Supplier
、Function
、Predicate
等。
示例:自定义函数式接口
@FunctionalInterface
public interface MyFunctionalInterface {
void doSomething(String message);
}
4. Lambda 表达式的使用场景
(1) 替代匿名内部类
// 使用匿名内部类
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
};
// 使用 Lambda 表达式
Runnable runnable2 = () -> System.out.println("Hello, World!");
(2) 集合操作
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
// 使用 Lambda 表达式遍历集合
list.forEach(item -> System.out.println(item));
// 使用方法引用
list.forEach(System.out::println);
(3) 排序
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
// 使用 Lambda 表达式排序
list.sort((s1, s2) -> s1.compareTo(s2));
// 使用方法引用
list.sort(String::compareTo);
(4) 过滤
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
// 使用 Lambda 表达式过滤
List<String> filteredList = list.stream()
.filter(item -> item.startsWith("A"))
.collect(Collectors.toList());
5. Lambda 表达式的参数
(1) 无参数
Runnable runnable = () -> System.out.println("No parameters");
(2) 单个参数
Consumer<String> consumer = (message) -> System.out.println(message);
(3) 多个参数
Comparator<Integer> comparator = (a, b) -> a.compareTo(b);
(4) 类型推断
// 编译器可以推断参数类型
Comparator<Integer> comparator = (a, b) -> a.compareTo(b);
6. Lambda 表达式的方法引用
方法引用是 Lambda 表达式的简化写法,用于直接引用已有的方法。
(1) 静态方法引用
Function<String, Integer> function = Integer::parseInt;
(2) 实例方法引用
Consumer<String> consumer = System.out::println;
(3) 对象方法引用
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
list.sort(String::compareTo);
(4) 构造方法引用
Supplier<List<String>> supplier = ArrayList::new;
7. Lambda 表达式的变量作用域
Lambda 表达式可以访问外部的局部变量,但这些变量必须是 final 或 effectively final(即不可变)。
示例
int num = 10;
Runnable runnable = () -> System.out.println(num); // num 必须是 final 或 effectively final
8. Lambda 表达式的示例
(1) 使用 Predicate
过滤集合
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
List<String> filteredList = list.stream()
.filter(item -> item.startsWith("A"))
.collect(Collectors.toList());
(2) 使用 Function
转换集合
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
List<Integer> lengths = list.stream()
.map(String::length)
.collect(Collectors.toList());
(3) 使用 Consumer
遍历集合
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
list.forEach(item -> System.out.println(item));
(4) 使用 Supplier
创建对象
Supplier<List<String>> supplier = ArrayList::new;
List<String> list = supplier.get();
9. 总结
- Lambda 表达式是 Java 8 引入的一种简洁语法,用于表示匿名函数。
- 需要与函数式接口配合使用。
- 支持类型推断、方法引用和变量作用域。
- 适用于集合操作、排序、过滤等场景。