java_Lambda表达式四个最基本的函数式接口

Lambda表达式

当需要启动一个线程去完成任务时,通常会通过 java.lang.Runnable 接口来定义任务内容,并使用java.lang.Thread 类来启动该线程。代码如下:

public class Demo{
          
   
	public static void main(String[] args) {
          
   
		// 匿名内部类
		Runnable task = new Runnable() {
          
   
			@Override
			public void run() {
          
    // 覆盖重写抽象方法
				System.out.println("多线程任务执行中!");
			}
		};
		new Thread(task).start(); // 启动线程
	}
}

对于 Runnable 的匿名内部类用法,可以分析出几点内容:

    Thread 类需要 Runnable 接口作为参数,其中的抽象 run 方法是用来指定线程任务内容的核心; 为了指定 run 的方法体,需要 Runnable 接口的实现类; 为了省去定义一个 RunnableImpl 实现类的麻烦,使用匿名内部类; 必须覆盖重写抽象 run 方法

借助Java 8的全新语法,上述 Runnable 接口的匿名内部类写法可以通过更简单的Lambda表达式达到等效:

public class Demo02LambdaRunnable {
          
   
	public static void main(String[] args) {
          
   
		new Thread(() -> System.out.println("多线程任务执行中!")).start(); // 启动线程
	}
}

这段代码和刚才的执行效果是完全一样的,可以在jdk1.8或更高的编译级别下通过

Lambda表达式的标准格式为: (参数类型 参数名称) -> { 代码语句 }

格式说明: (1)当(形参列表)是空参(),那么括号不能省略

(2)当(形参列表)只有一个形参时,并且类型也可以确定或可以推断时,可以省略()和数据类型,要省略就一起省略.

(3)当(形参列表)有多个时,而且类型也可以确定或可以推断时,可以省略数据类型

(4)当{Lambda体}中不止语句时,不能省略},并且每一个语句还必须加;

(5)当{Lambda体}只有一个语句时,可以省略{}和该语句的:

(6)当{Lambda体}只有一个语句,并且是一个{return 返回值;}语句,那么可以一起省略return和}和这个;

(7)当{Lambda体}如果不止一个语句,那么如果函数式接口的抽象方法有返回值,那么必须有return

四个最基本的函数式接口:

消费型接口Consumer:void accept(T t) 特点是,它的抽象方法:有参无返回值

供给型接口 Supplier:T get() 特点是,它的抽象方法:无参有返回值

判断型接口 Predicate:boolean test(T t) 特点是,它的抽象方法;boolean test(有参)无论你给我什么参数,都是用来判断条件,结果只有true,false

功能型接口 Function<T,R>:R apply(T t) 特点是,它的抽象方法:有参有返回值

方法引用和构造器引用

当{Lambda体}只有一句时,并且是通过调用一个类或一个对象的方法来完成的,并且函数式接口的抽象方法的形参列表和返回值类型与你调用的这个类或对象的方法的形参列表和返回值类型要对应。

当{Lambda体}只有一句时,并且是通过创建一个对象来完成的,并且函数式接口的抽象方法的形参列表和返回值类型与你构造器的形参列表与所创建的对象的类型要对应。

方法引用和构造器引用语法:

类名/对象名::方法名 类名/数组类型::new

经验分享 程序员 微信小程序 职场和发展