飞道的博客

Java多线程学习笔记(3)— “Lambda表达式”

474人阅读  评论(0)

一、Lambda表达式概念

Lambda表达式是java8中引入的新的编码方法,其质属于 “函数式编程 ” 的概念,主要目的是简化代码,与匿名内部类关系密切,可使用Lambda语法来代替匿名内部类,当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口

因此,理解函数式接口是java8 Lamdba表达式的关键所在。

1.函数式接口

定义: 任何接口,如果只包含一个抽象方法,那么他就是一个函数式接口。
(例如用于创建线程的Runnable接口,只有一个抽象方法)

class interface Runnable{
   

	public abstract void run();
		
}

对于函数式接口,我们就可以用Lambda表达式来创建它的对象。

二、为什么要用Lambda表达式

  1. 避免匿名内部类定义过多;
  2. 让代码更加简洁;
  3. 除去没有意义的代码,只留下核心逻辑。

三、Lambda表达式具体用法 ★

语法格式:

(参数)->语句(方法体);

1. 不需要参数,返回值为 5
() -> 5

2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x

3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y

4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y

5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

下面是Lambda表达式使用具体实例:


  • 首先我们定义一个函数式接口——Myinterface(只有一个run方法)

  • 创建Myclass类来实现Myinterface接口

没有使用Lambda的老方法:

(我们在主函数中创建实现类对象 i,并通过i来调用run方法)

使用Lambda表达式语法后:


四、Lambda表达式简化匿名内部类


其中:
Ilike为函数式接口名
lambda为接口中唯一的抽象方法
like为实现类的对象名

五、使用Lambda表达式实现Runnable接口创建线程

传统方法:

package bookTest;

class Runnable1 implements Runnable {
                                                                                                
	//重写run方法
	public void run() {
   
		//获取此线程名称
		System.out.println("线程1:"+Thread.currentThread().getName());
	}
	
}

public class RunnableDemo  {
   

	public static void main(String[] args) {
   
		//创建对象并启动线程
		Runnable1 r1 = new Runnable1();
		Thread t1 = new Thread(r1);
		t1.start();
	}

}

进一步简化代码(使用内部匿名类)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

package bookTest;


public class RunnableDemo  {
   

	public static void main(String[] args) {
   
		//使用内部匿名类简化代码
		Thread t1 = new Thread(new Runnable() {
   
			//重写run方法
			public void run() {
   
				System.out.println("线程1:"+Thread.currentThread().getName());
				
			}
		});
		t1.start();
	}

}

再进一步简化代码(使用Lambda表达式)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

package bookTest;


public class RunnableDemo  {
   

	public static void main(String[] args) {
   
		//使用Lambda简化代码
		Thread t1 = new Thread( ()->
				System.out.println("线程1:"+Thread.currentThread().getName()));
					
			t1.start();
		
	}

}

转载:https://blog.csdn.net/qq_47354826/article/details/116806640
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场