函数式接口
函数式接口在java指定的是:有且仅有一个抽象方法的接口就称为函数式接口。
函数式接口,设用于函数式编程的,在java当中的函数式编程体现在Lambda,所以函数式接口就是用来服务Lambda表达式。只有确定接口当中有且仅有一个抽象方法,java中的Lambda才能顺利进行推导
备注: “语法糖"是指使用更加便利方便,但是原理不变的代码语法。就比如遍历集合时使用for-each语法,其实底层使用的是迭代器,这便是"语法糖”。
@Functionallnterface注解
与@Override注解作用类似,java 8 专门为函数式接口引入的一个新注解@FunctionalInterface,该注解主要定义在接口上。一旦在接口上使用该注解,编译期将会强制检查该接口是不是一个函数式接口,该接口中是不是有且仅有一个抽象方法,如果不是,编译报错
自定义函数式接口的用途
对于自定义的函数式接口,一般用于方法的参数和返回值上
格式:
修饰符 interface InterfaceName{
// 只能定义一个抽象方法
public abstract 返回值类型 方法名称(参数列表);
// 还可以定义其他的非抽象方法
}
示例:
package com.hong.lambda;
/**
* @Author hongCheng
* @Date 2021/4/25 15:54
* @Version 1.0
*/
public class InterfaceTest {
public static void main(String[] args) {
USB uPan = new USB() {
@Override
public void show() {
System.out.println("使用右眼");
}
};
test(uPan);
//改进①
USB jianPan = () -> System.out.println("使用键盘");
test(jianPan);
//改进②
test(() -> System.out.println("使用蓝牙"));
}
//函数时接口方式的应用:作为方法的参数, 调用方法可以使用lambda表达式
public static void test(USB usb) {
usb.show();
}
}
//函数式接口:接口中只有一个抽象方法,该接口就是函数式接口
@FunctionalInterface//检验该接口是否为函数式接口
interface USB {
public void show();
//JDK8以后新增的特性
default void service() {
}
static void txt() {
}
}
常见的函数式接口
- Comsumer
Consumer
接口是一个类似消费者的接口,定义了一个名叫accept
的抽象方法,它的入参是一个泛型T对象,没有任何返回值(void)
示例
package com.hong.interfacetest;
import java.util.function.Consumer;
/**
* @Author hongCheng
* @Date 2021/4/25 16:23
* @Version 1.0
*/
public class ConsumerInterfaceTest {
public static void main(String[] args) {
//方式一
//MyConsumer<Double> consumer = new MyConsumer<>();
System.out.println("====方式二====");
System.out.println("lambda方式");
Consumer<Double> consumer = new Consumer<Double>(){
@Override
public