Lambda表达式是干什么的?
用来简化过于繁琐的编写代码的过程
冗余的Runnable代码
冗余指的就是多余的
我们来看一个例子,我们在创建线程的过程中,编写的代码多而复杂,如果使用Lambda表达式就可以省略很多不必要的代码,如下:
1、传统写法
public static void main(String[] args) {
/*
传统实现Runnable接口的写法
① 创建一个Runnable接口的实现类
② 在实现类中重写Runnable接口的实现类对象
③ 创建一个Runnable接口的实现类对象
④ 使用构造方法中传递Runnable接口的实现类对象创建Thread类对象
⑤ 调用Thread类中的start方法,开启新的线程执行run方法
*/
// 简化写法
// 使用Thread类创建新的线程
// 正常情况我们需要先创建Thread类的子类,然后覆盖重写run方法,然后创建子类的对象,最后使用创建的对象调用start方法开启线程任务
new Thread(){
// 重写run方法,设置线程任务
@Override
public void run() {
for (int i = 0 ; i <20 ; i++ ) {
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}
}.start();
// 简化写法
// 使用Runnable接口创建新的进程
Runnable r = new Runnable() {// 一个多态的写法,Runnable的实现类对象向上转型为Runnable类型
// 重写run方法,设置线程任务
@Override
public void run() {
for (int i = 0 ; i <20 ; i++ ) {
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}
};
new Thread(r).start();
// 简化写法
// 使用Runnable接口创建新的进程的另一种写法
new Thread(new Runnable() {// 一个多态的写法,Runnable的实现类对象向上转型为Runnable类型
// 重写run方法,设置线程任务
@Override
public void run() {
for (int i = 0 ; i <20 ; i++ ) {
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}
}).start();
}
2、代码分析
- Thread类需要Runnable接口作为参数,其中抽象的run方法是用来指定线程任务的
- 为了指定run的方法体,我们不得不需要Runnable接口的实现类来覆盖重写run方法
- 为了省去一个定义Runnable实现类的麻烦,我们不得不使用匿名内部类
- 我们必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值类型不得不再此写一遍,并且要保证书写正确
- 而实际上,似乎只有方法体中设置的线程任务才是关键所在
编程思想转换
很显然并不是我们想要区创建一个匿名内部类来创建一个新的线程,只是因为受限于面向对象的编程思想和语法,我们不得不区创建匿名内部类来达到我们的创建新的线程的目的,而我们真正想做的只是将run方法内的代码传递给Thread类。
在JDK1.8中加入了一个很重要的新特性就是Lambda表达式,为我们解决上述问题的烦恼
体验Lambda的更优写法
// 创建新线程的匿名内部类的写法
new Thread(new Runnable() {
public void run() {
for (int i = 0 ; i <20 ; i++ ) {
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}
}).start();
// 使用Lambda表达式来创建新的线程
new Thread(() -> {
for (int i = 0 ; i <20 ; i++ ) {
System.out.println(Thread.currentThread().getName() + "-->" + i);
}
}
).start();
Lambda标准格式
1、Lambda表达式的组成部分
- 一些参数
- 一个箭头
- 一段代码
2、格式如下
(参数列表) -> {一些重写方法的代码}
3、格式的解释说明
():接口中抽象方法的参数列表,没有参数就空着,如果有参数就写出参数,多个参数使用都好分割
->:传递的意思,把参数传递给方法体{}
{}:重写接口抽象方法的方法体
4、Lambda表达式在书写过程中可以省略的地方
① (参数列表):括号中参数列表的数据类型,可以省略不写
② (参数列表):如果括号中的参数只有一个,那么数据类型和()都可以省略
③ {一些代码}:如果{}中的代码只有一行,无论是否含有返回值,都可以省略{}和return和分号,但是需要注意的是,要省略的话必须要同时省略{}和return和分号