函数式接口
- 在 Java 中,当接口中只有一个抽象方法时,该接口就称为函数式接口。
- 函数式接口,即适用于函数式编程场景的接口。
- 而 Java 中的函数式编程就是 Lambda,即函数式接口就是可以适用于 Lambda 使用的接口。
- 接口中只有一个抽象方法时,Java 中的 Lambda 才能顺利地进行类型的推导。
- 函数式接口都是先使用 Lambda 接口实现方法体,再调用接口中的方法。
函数式接口的格式
@FunctionalInterface 注解:
//这个注解是 JDK1.8 新增的特性,用来修饰接口的定义,表明该接口是一个函数式接口。
@FunctionalInterface
interface 接口名{
//返回类型 方法名(参数列表);
}
// Runnable、Comparator 都属于函数式接口。
自定义函数式接口
无参无返回值
案例步骤1. 定义一个函数式接口 Eatable,加上注解:@FunctionalInterface2. 接口中包含抽象 eat()方法,没有参数或返回值。3. 在 main()函数中使用 Lambda 创建 Eatable 对象,输出一句话:吃东西。4. 调用对象的 eat()方法
案例代码
@FunctionalInterface
interface Eatable {
void eat();
}
public class DemoFunctional {
public static void main(String[] args) {
//使用 lambda 表达式实现对象
Eatable eatable = ()-> System.out.println("吃东西");
eatable.eat();
}
}
有参有返回值
案例步骤1. 定义一个函数式接口 Sumable,加上注解:@FunctionalInterface2. 接口中包含抽象 int sum(int a, int b)方法,将两个 int 数字相加返回 int 结果。3. 在类中通过 Lambda 实例化 Sumable 接口,并且调用 sum()方法4. 输出计算结果的值
//有返回值,有参数
@FunctionalInterface
interface Sumable {
int sum(int a, int b);
}
public class DemoFunctional {
public static void main(String[] args) {
//实例化接口
Sumable sumable = (a, b) -> a + b;
//调用方法
int sum = sumable.sum(5, 10);
//输出计算结果
System.out.println("计算结果:" + sum);
}
}
关于@FunctionalInterface 注解的说明:
- 该注解用在只有一个抽象方法的接口上,接口中可以存在其它的非抽象方法。
- 如果该接口有超过一个抽象方法,则编译失败。
- 接口中的静态方法和默认方法都不是抽象方法。
- 接口中定义的与 Object 类同名的抽象方法不算抽象方法,因为此接口的实现类一定是 Object 的子类,会自动实现这个接口中定义的抽象方法。
- 如果接口中只有一个抽象方法,不管是否使用@FunctionalInterface 修饰,该接口都是函数式接口.
- 加上注解的目的是让编译器进行语法检查,类似于以前学的@Override 注解。
- 接口加这个注解还可以限制后期对此接口修改时再加上新的抽象方法,从而保证这个函数式接口只有一个抽象方法。
下面定义的接口是否是函数式接口,编译能不能通过?为什么?
@FunctionalInterface
public interface Animal {
void eat();
public String toString();
default void sleep() {
System.out.println("睡觉");
}
static void move() {
System.out.println("行走");
}
}
接口中定义的与 Object 类同名的抽象方法不算抽象方法,
接口中的静态方法和默认方法都不是抽象方法。
转自函数式接口