Java 8 带来了一种新的编程模型 - Lambda 表达式,它提供了更简洁的方式来表述匿名函数,能大大简化 Java 代码。本文将详细介绍 Lambda 表达式的语法以及使用场景。
1. Lambda 基础语法
基础语法格式:
( 参数列表 ) -> { 方法体 }
-
参数列表:可以是空的或包含一个/多个参数。
-
-> 符号:分隔参数与方法体。
-
方法体:可以包含一行或多行代码。
例子 1:比较传统方式和 Lambda
// 传统方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread is running...");
}
}).start();
// 使用 Lambda
new Thread(() -> System.out.println("Thread is running...")) .start();
2. Lambda 和集合
例子 2:遍历集合
List<String> list = Arrays.asList("Java", "Python", "C++");
// 传统方式
for (String s : list) {
System.out.println(s);
}
// Lambda 方式
list.forEach(s -> System.out.println(s));
// 方法引用
list.forEach(System.out::println);
例子 3:比较 Comparator
List<String> names = Arrays.asList("Tom", "Jerry", "Alice", "Bob");
// 传统方式
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
// Lambda 方式
names.sort((o1, o2) -> o1.compareTo(o2));
// 方法引用
names.sort(String::compareTo);
3. 函数式接口
Lambda 表达式仅能用于 函数式接口(只包含一个抽象方法的接口)。Java 8 提供了一些常见函数式接口:
-
Consumer<T>
:accept(T t)
-
Supplier<T>
:get()
-
Function<T, R>
:apply(T t)
-
Predicate<T>
:test(T t)
例子 4:常见函数式接口
// Consumer 接口:接受参数,没有返回值
Consumer<String> printer = s -> System.out.println(s);
printer.accept("Hello, Lambda!");
// Supplier 接口:没有参数,返回一个值
Supplier<Double> randomNumber = () -> Math.random();
System.out.println(randomNumber.get());
4. Lambda 合併 Stream API
Java 8 提供了 Stream API,配合 Lambda 能大大提高数据处理效率。
例子 5:Stream API 简化数据操作
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 计算所有偶数的平方和
int sum = numbers.stream()
.filter(n -> n % 2 == 0) // 过滤偶数
.map(n -> n * n) // 计算平方
.reduce(0, Integer::sum); // 求和
System.out.println(sum); // 20
5. 总结
-
Lambda 表达式使用更简洁的方式表述匿名函数。
-
仅能用于函数式接口(只包含一个抽象方法的接口)。
-
和 Stream API 结合使用,能大大提高集合数据处理效率。