时代变了,还不会Lambda表达式?

774 阅读2分钟

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 南通