什么是Lambda表达式
Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理。
Lambda的优点
简化匿名内部类的使用,语法更加简单。
Lambda标准格式
Lambda的标准格式由3个部分组成: 参数列表
、 ->
、 方法体
(参数类型 参数名称) -> {
代码体;
}
Lambda省略格式
- 小括号内
参数的类型
可以省略 - 如果小括号内 有且仅有一个参数 ,则
小括号
可以省略 - 如果大括号内 有且仅有一个语句 ,可以
同时
省略大括号、return关键字及语句分号
// 假设有一个将list内容遍历的需求
List<String> list= Arrays.asList("a","b","c");
// Lambda标准格式 遍历
list.forEach((String e) -> {
System.out.println(e);
});
// Lambda省略格式 遍历
list.forEach( e-> System.out.println(e) );
Lambda表达式可以引用类成员和局部变量(会将这些变量隐式得转换成final的),例如下列两个代码块的效果完全相同:
String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.print( e + separator ) );
和
final String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.print( e + separator ) );
Lambda的前提条件
Lambda的语法非常简洁,但是Lambda表达式不是随便使用的,使用时有几个条件要特别注意:
- 方法的参数或局部变量类型 必须为接口
- 这个接口中 有且仅有一个 抽象方法
Lambda 使用示例
//返回数组元素最大值
public class DemoLambda {
// 一个有且仅有一个抽象方法的接口
interface testInterface {
int printMax();
}
// 方法的参数为接口
private static void printMax(testInterface testInterface) {
int max = testInterface.printMax();
System.out.println("max = " + max);
}
public static void main(String[] args) {
// 调用printMax,使用Lambda重写抽象方法
printMax(() -> {
int[] arr = {10, 20, 100, 30, 40, 50};
// 先排序,最后就是最大的
Arrays.sort(arr);
return arr[arr.length - 1];
});
}
}
Lambda和匿名内部类对比
- 所需的类型不一样
- 匿名内部类,需要的类型可以是类,抽象类,接口
- Lambda表达式,需要的类型必须是接口
- 抽象方法的数量不一样
- 匿名内部类所需的接口中抽象方法的数量随意
- Lambda表达式所需的接口只能有一个抽象方法
- 实现原理不同
- 匿名内部类是在编译后会形成class
- Lambda表达式是在程序运行的时候动态生成class
当接口中只有一个抽象方法时,建议使用Lambda表达式,其他其他情况还是需要使用匿名内部类