概述

介绍

Lambda表达式就是对某一个接口方法的实现,可以替代我们以前经常写的匿名内部类来实现接口方法,本质是一个匿名函数

使用的要求

接口必须是函数式接口,也就是说这个接口有且仅有一个抽象方法,但是可以有多个非抽象方法

函数式接口

函数式接口示例代码如下:(add是抽象方法,add1和add2是非抽象方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
@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

代码实现

定义函数式接口

1
2
3
4
@FunctionalInterface
interface MyInterface1 {
int add(int a, int b);
}

使用匿名内部类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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表达式如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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表达式简写规则可以将上面的代码简写,代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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));
}
}