本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、体验 Lambda 的优雅写法
- 借助 JDK 8 的全新语法,上述
Runnable
接口的匿名内部类写法可以通过更加简单的 Lambda 表达式达到同等效果:
package com.github.demo2;
public class Test {
public static void main(String[] args) {
new Thread(() -> System.out.println("多线程任务执行!!!!")).start();
}
}
- 这段代码的执行效果和匿名内部类写法的执行效果一致,可以在 JDK 8 及其以上版本编译通过。从代码的语义可以看出:我们启动的一个线程,而线程的任务内容以一种更加简洁的形式被指定。
- 不再有
不得不创建接口对象
的束缚,不再有抽象方法覆盖重写
的负担,就是这么爽
函数式接口
概述
- Lambda 表达式其实就是实现 SAM(Single Abstract Method,即该接口中有且仅有一个抽象方法,当然该接口中还可以包含非抽象方法)接口的语法糖。
- 其实,只要满足 SAM 特征的接口就是函数式接口,就可以使用 Lambda 表达式了,但是如果在声明函数式接口的时候,使用
@FunctionalInterface
注解来声明,那么编译器就会强制检查该接口是否确实有且仅有一个抽象方法,如果不是,将报错。
- 之前学过的SAM接口中,标记了
@FunctionalInterface
注解的接口有:Runnable、Comparator、FileFilter。
- JDK 8 在
java.util.function
包中新增了很多函数式接口,主要分为消费型、供给型、断言型(判断型)、函数型(功能型)。基本上可以满足我们实际的开发,当然,我们也可以自定义函数式接口。
自定义函数式接口
@FunctionalInterface
修饰符 interface 接口名{
[public abstract] 返回值类型 方法名(形参列表);
}
注意:在接口中的抽象方法,可以省略 public abstract
关键字的。
- 示例:
package com.github.demo3;
/**
* 计算
*/
@FunctionalInterface
public interface Calculator {
int calc(int a, int b);
}