一、Lambda表达式

1.Lambda表达式使用前后的对比:

举例一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void test1(){

Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("我爱北京天安门");
}
};

r1.run();

System.out.println("***********************");

Runnable r2 = () -> System.out.println("我爱北京故宫");

r2.run();
}

举例二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Test
public void test2(){

Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};

int compare1 = com1.compare(12,21);
System.out.println(compare1);

System.out.println("***********************");
//Lambda表达式的写法
Comparator<Integer> com2 = (o1,o2) -> Integer.compare(o1,o2);

int compare2 = com2.compare(32,21);
System.out.println(compare2);


System.out.println("***********************");
//方法引用
Comparator<Integer> com3 = Integer :: compare;

int compare3 = com3.compare(32,21);
System.out.println(compare3);
}

2.Lambda表达式的基本语法:

1.举例: (o1,o2) -> Integer.compare(o1,o2);

2.格式:

  • lambda操作符 或 箭头操作符

  • 左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)

  • 右边:lambda体 (其实就是重写的抽象方法的方法体)

3.如何使用:分为六种情况

image-20210406122928717

image-20210406122937819

总结六种情况:

  • 左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只一个参数,其一对()也可以省略

  • 右边:lambda体应该使用一对{}包裹;如果lambda体只一条执行语句(可能是return语句,省略这一对{}和return关键字

二、函数式接口

1.函数式接口的使用说明

  • 如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。

  • 我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。

  • Lambda表达式的本质:作为函数式接口的实例

2.Java8中关于Lambda表达式提供的4个基本的函数式接口

具体使用:

image-20210406123305364

3.总结

3.1 何时使用lambda表达式?

当需要对一个函数式接口实例化的时候,可以使用lambda表达式。

3.2 何时使用给定的函数式接口?

如果我们开发中需要定义一个函数式接口,首先看看在已有的jdk提供的函数式接口是否提供了能满足需求的函数式接口。如果有,则直接调用即可,不需要自己再自定义了。