Lambda表达式
lambda表达式是本质上是一个匿名函数,它可以适用于的函数式接口(标注有@FunctionalInterface),该接口有且仅有一个抽象方法。
# 函数式接口的特点:
- 有且仅有一个抽象方法(没有函数体的方法)
- 允许重写Object的public方法
- 允许定义default方法
- 允许定义静态非抽象方法
@FunctionalInterface不是必须的
通过一个简单的例子认识lambda表达式,Java中线程的启动可以通过构造方法Thread(Runnable runnable)实现,这是一个典型的匿名类:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("running...");
}
});
thread.start();
使用lambda表达式将会变得异常简单:
Thread thread = new Thread(() -> System.out.println("running by lambda..."));
thread.start();
//一行搞定?
//new Thread(() -> System.out.println("running by lambda...")).start();
lambda表达式() -> {},左边对应抽象方法参数,右边对应抽象方法的方法体,有如下一些规则:
- 有且仅有一个参数时,可以省略小括号
- 函数体有且仅有一条语句时,可以省略大括号和语句分号
- 如果方法有返回值并且方法体是直接返回具体值时,可以省略
return;如果不省略return,则不能省略大括号
下面通过几个例子加深lambda表达式的理解。
# 例1 方法体多条语句请不要省略大括号
Thread thread = new Thread(() -> {
System.out.println("running...");
System.out.println("running by lambda...");
});
thread.start();
# 例2 如果有返回值可以直接写返回值,可以省略return语句;如果不省略return,即使只有一句也要加括号;有多个参数不能省略小括号
有了lambda表达式,集合的排序也更加简单了;sort(Comparator comparator)可以使用lambda表达式
List<Integer> list = Arrays.asList(12, 23, 35, 11, 2, 15);
list.sort((a, b) -> b - a); //返回b-a
System.out.println(list);
//[35, 23, 15, 12, 11, 2]
//这样写不会报错:
list.sort((a, b) -> {
return b - a;
});
//这样写会报错:
list.sort((a, b) -> return b - a );
Lambda表达式还有很多应用,下次将Stream流操作的时候再说吧。

2020 07 24 南通