概念
函数式接口在java中是指:有且仅有一个抽象方法的接口。(当然它可以包含其他的方法,比如默认的,私有的,但是抽象的只能有一个)
函数式接口,即适用于函数式编程场景的接口。而java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,java中的Lambda才能顺利地进行推导。
题外话:
“语法糖”是指使用更加方便,但是原理不变的代码语法。例如在遍历集合时使用的for-each语法,其实底层的实现原理仍然是迭代器,这便是“语法糖”。从应用层面来讲,java中的Lambda可以被当做是匿名内部类的“语法糖”,但是二者在原理上是不同的。
格式
只要确保接口中有且仅有一个抽象方法即可
修饰符 interface 接口名称{public abstract 返回值类型 方法名称(参数信息);
}
@FunctionalInterface注解
作用:
检测一个接口是否是一个函数式接口。如果编译失败:接口中没有抽象方法或者抽象方法大于1个
函数式接口的使用
一般可以作为方法的参数和返回值类型。
这里有Lambda的一些介绍java中的Lambda表达式
public class Demo{public static void show(MyInterface my){my.method();}public static void main(String[] args){show(new MyImpl());show(new Myinterface(){public void method(){System.out.println("使用匿名内部类重写接口中的抽象方法");}});show(()->{System.out.println("使用Lambda表达式重写接口中的抽象方法");});show(()->System.out.println("使用Lambda表达式重写接口中的抽象方法"));}
}
匿名内部类和Lambda表达式的区别,虽然一个可以看做语法糖
编译后,匿名内部类也会生成对应的class文件,只不过有$符号。但Lambda不会,所以这样可以节省内存,少了内存加载文件这样一个步骤,所以后者的效率更高。