文章目录
- 一、简介
- 二、格式
- 三、举例
- 四、使用场景
- 五、@FunctionalInterface注解
- 六、Lambda表达式的简化方式
- 省略参数类型:如果上下文已经明确了参数的类型,可以省略参数类型的声明。
- 省略参数括号:如果只有一个参数,可以省略参数的括号。
- 省略大括号和return关键字:如果Lambda表达式只有一条语句,并且是返回一个表达式的结果,可以省略大括号和return关键字。
- 方法引用:如果Lambda表达式只是调用一个已存在的方法,可以使用方法引用来代替Lambda表达式
一、简介
Lambda 表达式是 JDK8 引入的一种新的编程语法,用于简化函数式接口的实现。
Lambda 表达式的出现可以取代大多数匿名内部类,写出更简洁优雅的代码。
二、格式
(参数1,参数2) -> {方法体}
三、举例
在 JDK 8 之前,我们创建线程(实际开发推荐用线程池)并启动可以使用匿名内部类的写法:
new Thread(new Runnable() {
@Override
public void run() {
doBusiness();
}
}).start();
在 JDK 8 之后,我们可以使用 Lambda 表达式的写法:
new Thread(() -> {
doBusiness();
}).start();
如果方法体里只有一行代码,我们甚至可以省略大括号:
new Thread(() -> doBusiness()).start();
四、使用场景
通过上面的例子,我们可以看到 Lambda 表达式省略了 new Runnable()
,这是可以通过 Thread 的方法参数推导出来的,可以理解,但是为什么方法名(run
)也可以省略呢,原因就是 Runnable 接口内部只有 run
这一个抽象方法,当接口只有一个抽象方法的时候,实现类必须重写并且只能重写这个方法,所以就不用关心这个方法叫什么名字了,只需要关心方法参数和方法体
五、@FunctionalInterface注解
上面我们讲到,当接口只有一个抽象方法,就可以使用 Lambda 表达式来简化这个接口的匿名内部类的写法,所以 JDK 8 还推出了 @FunctionalInterface 注解,用来定义:有且只有一个抽象方法,但是可以有很多个非抽象方法的接口,这个注解标注在接口上,声明接口是函数式接口,且只是在编译期做校验,如果声明多个抽象方法,就会报错,如下:
这样就可以用 Lambda 表达式来声明这个接口的实现,JDK 8 还提供了四大函数式接口,具体可参考我的另一篇文章:Java8新特性之——函数式接口(Function、Consumer、Supplier、Predicate)
六、Lambda表达式的简化方式
省略参数类型:如果上下文已经明确了参数的类型,可以省略参数类型的声明。
@FunctionalInterface
public interface MyInterface {
String abstractMethod(String param);
}
public class MyTest {
public static void main(String[] args) {
// 原本写法
testMethod((String param) -> {
return "Hello " + param;
});
// 省略参数类型
testMethod((param) -> {
return "Hello " + param;
});
}
private static void testMethod(MyInterface m) {
String str = m.abstractMethod("World");
System.out.println(str);
}
}
省略参数括号:如果只有一个参数,可以省略参数的括号。
@FunctionalInterface
public interface MyInterface {
String abstractMethod(String param);
}
public class MyTest {
public static void main(String[] args) {
// 原本写法
testMethod((param) -> {
return "Hello " + param;
});
// 省略括号
testMethod(param -> {
return "Hello " + param;
});
}
private static void testMethod(MyInterface m) {
String str = m.abstractMethod("World");
System.out.println(str);
}
}
省略大括号和return关键字:如果Lambda表达式只有一条语句,并且是返回一个表达式的结果,可以省略大括号和return关键字。
@FunctionalInterface
public interface MyInterface {
String abstractMethod(String param);
}
public class MyTest {
public static void main(String[] args) {
// 原本写法
testMethod(param -> {
return "Hello " + param;
});
// 省略括号
testMethod(param -> "Hello " + param);
}
private static void testMethod(MyInterface m) {
String str = m.abstractMethod("World");
System.out.println(str);
}
}
方法引用:如果Lambda表达式只是调用一个已存在的方法,可以使用方法引用来代替Lambda表达式
具体可参考我的另一篇文章:Java8新特性之——方法引用