JDK8新特性-Lambda
说明
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
相关概念
Lambda表达式只和函数式接口有关
Lambda表达式用于取代函数式接口的实现类及其方法
函数式接口
参考:《函数式接口 - 前度刘郎 - 博客园 》
有且仅有一个抽象方法的接口称为“函数式接口”。
这个条件决定了Lambda中,为什么我们能够直接在“->”后面写的内容就认为是重写的内容,因为假设有多个抽象方法,我哪知道“->”后面的这些代码是属于哪个方法的呢?
虚拟机会自动识别函数式接口,但是最好加上@Functional Interface注解防止他人添加方法。Java中的Lambda无法单独出现,它需要一个函数式接口来盛放,Lambda表达式方法体其实就是函数接口的实现。
这是一个函数式接口的典型例子:
package java.lang;
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
特征
以下是lambda表达式的重要特征:
-
**可选类型声明:**不需要声明参数类型,编译器可以统一识别参数值。
-
**可选的参数圆括号:**一个参数无需定义圆括号,但多个参数需要定义圆括号。
-
**可选的大括号:**如果主体包含了一个语句,就不需要使用大括号。
-
**可选的返回关键字:**如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
特征的意思大概是,完整体的Lambda表达式有类型声明、圆括号、大括号、返回关键字等内容,它们在特定的情况下都是可以省略的,还是看例子比较实际
使用场景
凡是需要实现函数式接口的类都可以用lambda来代替
还是拿Runnable举例:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("正常处理匿名内部类");
}
}).start();
//简化后
new Thread(() -> System.out.println("Lambda实现")).start();
哪些特征在什么情况下能可选/省略
1、省略参数
上述例子中,Runnable接口的run()方法没有参数,所以new Thread里面的()不用写参数;
2、单一参数时省略参数类型和圆括号
3、大括号省略
如果主体包含了一个语句,就不需要使用大括号。,参考2中的截图。
4、省略返回关键字
如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
@Test
void test2() {
//只有一个表达式的时候,大括号可以省略
RobotEntity.withReturnDaoAction(() -> 1000);
//只有一个表达式的时候,大括号可以省略
RobotEntity.withReturnDaoAction(() -> LambdaTests.cal());
//多个表达式时,用return
RobotEntity.withReturnDaoAction(() -> {
System.out.println();
return 2000;
});
}
参考:
Java Lambda 表达式 | 菜鸟教程 https://www.runoob.com/java/java8-lambda-expressions.html
fanyang_china/article/details/87798829)》
Java Lambda 表达式 | 菜鸟教程 https://www.runoob.com/java/java8-lambda-expressions.html
《Java8 lambda/方法引用》 https://blog.csdn.net/White_i/article/details/108836987