Lambda表达式是干什么的?如何使用?

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和分号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值