Lamda表达式简单了解


Lamda表达式

【狂神说Java】多线程详解_哔哩哔哩_bilibili

1.啥东西

Lamda表达式

  • 为什么要使用lambda表达式
    • 避免匿名内部类定义过多
    • 可以让你的代码看起来很简洁
    • 去掉了一堆没有意义的代码,只留下核心的逻辑。

也许你会说,我看了Lambda表达式,不但不觉得简洁,反而觉得更乱,看不懂了。那是因为我们还没有习惯,用的多了,看习惯了,就好了。

1. 函数式接口

  • 理解Functional Interface(函数式接口)是学习Java8 lambda表达式的关键所在。

  • 函数式接口的定义:
    任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
    函数式接口

  • 对于函数式接口,我们可以通过lambda表达式来创建该接口的对象

2.Lambda表达式优化过程

看代码:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// 1. 定义一个函数式接口
interface ILike{
void lambda();
}

// 2.实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println("2.普通的实现类");
}
}

public class TestLambda1 {
// 3.静态内部类
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println("3.放在类内部的类,使用static");
}
}

public static void main(String[] args) {
// 调用函数式接口的对象
ILike like1 = new Like();
like1.lambda();

// 调用3静态内部类
ILike like2 = new Like2();
like2.lambda();

// 4.局部内部类
class Like3 implements ILike{
@Override
public void lambda() {
System.out.println("4.局部内部类,放在main方法里面");
}
}

ILike like3 = new Like3();
like3.lambda();

// 5. 匿名内部类,没有类名,必须借助接口或者父类
ILike like4 = new ILike() {
@Override
public void lambda() {
System.out.println("5.匿名内部类,不再需要类名,直接父类/接口的构造函数后面{}跟子类代码");
}
};
like4.lambda();

// 6. Lambda简化,只留下函数的括号还有函数内部代码
ILike like5 = ()->{
System.out.println("6.Lambda简化后,不再需要构造方法名和函数名,根据变量类型来判断的。加个->");
};
like5.lambda();

}
}

3.带参数的 Lambda表达式

看代码就行了

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
29
30
31
interface Printer{
void myPrint(String s);
}

public class TestLambda2 {
public static void main(String[] args) {
String a = "Hello World";

// 带参数的Lambda实现
Printer printer1 = (String s)->{
System.out.println("Lambda1 + " + s);
};
printer1.myPrint(a);

// 简化1,去掉参数类型
Printer printer2 = (s)-> {
System.out.println("去参数类型: "+s);
};
printer2.myPrint(a);

// 简化2,去掉参数括号(只有一个参数的时候)
Printer printer3 = s-> {
System.out.println("去小括号: "+s);
};
printer3.myPrint(a);

// 简化3,去掉函数的大括号(只有一行的时候)
Printer printer4 = s-> System.out.println("一行的时候,去大括号: "+s);
printer4.myPrint(a);
}
}

多线程中的 Runnable 就是一个函数式接口。


文章作者: SongX64
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 SongX64 !
  目录