Java Lambda语法
什么是Lambda表达式?
Lambda表达式是Java 8中引入的一个重要特性,它提供了一种简洁的方式来表示可传递的匿名函数:它没有名称,但有参数列表、函数体、返回类型,可能还有一个可以抛出的异常列表。
简单来说,Lambda表达式让我们能够将函数作为方法参数传递,或者将代码作为数据处理。这是Java向函数式编程迈出的重要一步。
备注
Lambda表达式主要用于实现函数式接口(只包含一个抽象方法的接口)。Java 8之前,我们通常使用匿名内部类来实现这些接口。
Lambda表达式基本语法
Lambda表达式的基本语法如下:
(参数列表) -> {函数体}
其中:
- 参数列表:可以是空参数
()
,单个参数x
,或多个参数(x, y)
- 箭头符号:
->
分隔参数列表和函数体 - 函数体:包含表达式或语句的代码块
简化语法规则
Lambda表达式有几种简化形式:
-
当参数只有一个且类型可推断时,可以省略小括号:
x -> x * x
-
当函数 体只有一条语句时,可以省略大括号和return关键字:
(x, y) -> x + y
-
当函数体有多条语句时,必须使用大括号和return关键字:
(x, y) -> {
int sum = x + y;
return sum;
}
Lambda表达式实例
让我们通过几个例子来理解Lambda表达式的使用:
示例1:简单的Lambda表达式
// 使用匿名内部类的传统方式
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("使用匿名内部类");
}
};
// 使用Lambda表达式
Runnable runnable2 = () -> System.out.println("使用Lambda表达式");
// 调用方式相同
runnable1.run(); // 输出: 使用匿名内部类
runnable2.run(); // 输出: 使用Lambda表达式
示例2:带参数的Lambda表达式
// 使用匿名内部类
Comparator<Integer> comparator1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
};
// 使用Lambda表达式
Comparator<Integer> comparator2 = (o1, o2) -> o1.compareTo(o2);
// 进一步简化,使用方法引用
Comparator<Integer> comparator3 = Integer::compareTo;
// 测试
System.out.println(comparator1.compare(5, 3)); // 输出: 1
System.out.println(comparator2.compare(5, 3)); // 输出: 1
System.out.println(comparator3.compare(5, 3)); // 输出: 1
示例3:多语句的Lambda表达式
// 计算两个数的最大公约数
BiFunction<Integer, Integer, Integer> gcd = (a, b) -> {
if (a < b) {
int temp = a;
a = b;
b = temp;
}
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
};
System.out.println(gcd.apply(48, 18)); // 输出: 6
Lambda表达式与函数式接口
Lambda表达式可以赋值给函数式接口类型的变量。Java 8提供了一系列内置的函数式接口: