概述
介绍
Lambda表达式就是对某一个接口方法的实现,可以替代我们以前经常写的匿名内部类来实现接口方法,本质是一个匿名函数
使用的要求
接口必须是函数式接口,也就是说这个接口有且仅有一个抽象方法,但是可以有多个非抽象方法
函数式接口
函数式接口示例代码如下:(add是抽象方法,add1和add2是非抽象方法)
@FunctionalInterface
interface MyInterface1 {
int add(int a, int b);
static int add1(int a, int b) {
return a + b;
}
static int add2(int a, int b, int c) {
return a + b + c;
}
}
使用@FunctionalInterface
注解后,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。不使用这个注解也是可以的,这个注解只是用来检查是否是函数式接口,没有其它作用,只要接口只有一个抽象方法那它就是函数式接口,和注解没有任何关系
Lambda表达式格式
(参数列表)->{方法体}
说明:
()
:用来描述参数列表
{}
:用来描述方法体
->
:Lambda运算符,可以叫做箭头符号,或者goes to
代码实现
定义函数式接口
@FunctionalInterface
interface MyInterface1 {
int add(int a, int b);
}
使用匿名内部类
package lambda;
/**
* @author LeDao
* @company
* @create 2022-04-26 0:50
*/
public class LambdaTest {
public static void main(String[] args) {
MyInterface m1 = new MyInterface() {
@Override
public int add(int a, int b) {
return a + b;
}
};
System.out.println(m1.add(1, 2));
}
}
使用Lambda表达式
在上面的接口中,int a, int b
是参数列表,方法体是接口的实现(根据接口名称应该知道方法体是return a+b;
),所以Lambda表达式如下所示:
package lambda;
/**
* @author LeDao
* @company
* @create 2022-04-26 0:50
*/
public class LambdaTest {
public static void main(String[] args) {
MyInterface m2 = (int a, int b) -> {
return a + b;
};
System.out.println(m2.add(2, 3));
}
}
Lambda表达式简写规则
参数类型可以省略,因为可以根据接口方法知道参数的类型
当参数只有一个时,括号()
可以省略,如果有两个及以上的参数括号不可以省略
当方法体的语句只有一条时,可以省略大括号{}
简写上面的Lambda表达式
根据Lambda表达式简写规则可以将上面的代码简写,代码如下所示:
package lambda;
/**
* @author LeDao
* @company
* @create 2022-04-26 0:50
*/
public class LambdaTest {
public static void main(String[] args) {
MyInterface m2 = (a, b) -> a + b;
System.out.println(m2.add(2, 3));
}
}