21、Lambda表达式(箭头函数)
1、为什么使用Lambda表达式
匿名内部类的一个问题是:如果匿名类的实现非常简单,比如仅包含一个方法的接口,则匿名类的语法可能看起来笨拙且不清楚。
在这些情况下,通常试图将功能作为参数传递给另外一种方法,例如,当某人要单击按钮时应采取什么措施。
Lambda表达式可以解决这个问题,即将功能视为方法参数,或将代码视为数据。
示例:接口仅有一个方法
public class Example01 {
public static void main(String[] args) {
Actor actor = new Actor() {
@Override
public void performance() {
System.out.println("演员表演节目");
}
};
actor.performance();
}
}
interface Actor {
void performance();
}
从上面的代码中可以看出:匿名内部类知识对Actor接口的实现,重点是强调其有表演节目的方法(行为),如果可以直接将表演节目的方法复制给actor对象的引用,使得actor对象的引用在调用接口方法时直接执行该行为,那么将大大地节省代码的编写量,而Lambda表达式可以实现以上的功能
2、什么使用Lambda表达式
2.1 lambda表达式语法
(参数类型1 变量1, 参数类型2 变量2,... 参数类型n, 变量n) -> {
//代码块
return 返回值;
}
用Lambda表达式实现
public class Example01 {
public static void main(String[] args) {
//函数式编程思想,用lambda语法实现
Actor actor = () -> {
System.out.println("演员表演节目");
};
actor.performance();
}
}
interface Actor {
void performance();
}
Lambda表达式只能使用在只有一个方法的接口上。只有一个方法的接口称之为函数式接口(Function interface)
3、lambda表达式的省略规则
- 参数列表中的所有参数类型都可以省略
- 如果仅有且仅有一个参数,
()
可以省略 - 如果代码块中有且仅有一条语句,那么
{}
省略,此条语句后分号也省略 - 如果代码块中有且仅有一条语句且是
return
语句,那么除了{}
省略,此条语句后的分号省略以外,return
关键字也需要省略【三者需要都省略】
public class Example01 {
public static void main(String[] args) {
//函数式编程思想,用lambda语法实现
Actor actor = o ->
System.out.println(o);
actor.performance("演员表演节目");
}
}
interface Actor {
void performance(Object o);
}