Java8 函数式接口
1 什么是函数式接口
函数式接口是java8 中的一个新增内容,它只允许在其中使用一个抽象方法,这些接口也称为单个抽象方法接口(SAM接口)
在java8 中 ,函数式接口,可以使用lambda 表达式,方法引用和 构造函数引用来表示
Java8 中 也引入了一个注解,@functionalinterface 当你注释的接口违反了一个抽象方法的契约时,会导致编译出错.
让我们来构建我们的第一个 函数式接口
@FunctionalInterface
public interface MyFirstFunctionalInterface
{
public void firstWork();
}
当我们向 这个接口中添加另一个抽象方法,的时候会导致编译出错
@FunctionalInterface
public interface MyFirstFunctionalInterface {
public void firstWork();
public void secendWork();
}
错误信息 :multiple non-overriding abstract` `methods found in interface` `MyFirstFunctionalInterface
我们使用的idea 编辑器 会直接报错,错误信息显示有 多个未被重写的方法在这个接口中
2 功能接口中的注意点
- 函数式接口中只允许使用一种抽象方法,第二个抽象方法是不允许的,如果我们删除了
@FunctionalInterface这个注解,然后我们可以添加上一个抽象方法,但是这接口已经不是函数式接口, - 当
@FunctionalInterface不在接口上标识,如果这个接口符合函数式接口的规范,那么这个接口依然有效,它只是通知编译器执行接口内的单个抽象方法 - 从理论上说,函数式接口只有一个抽象方法, 默认方法有自己的实现,因为默认方法不是抽象的,所以你可以自由的添加一个默认方法到你自己的函数式接口中,
下面是一个有效的函数式接口实例
@FunctionalInterface
public interface MyFirstFunctionalInterface
{
// 抽象方法
public void firstWork();
default void doSomeMoreWork1(){
//Method body
}
default void doSomeMoreWork2(){
//Method body
}
}
这个方法中有一个抽象方法,有两个默认方法,这两个默认方法都有自己的实现,
-
如果一个接口中声明了一个抽象方法重写了公共的方法,
java.lang.Object方法中的的方法,这个方法也是不计入到抽象方法的计数中的,@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); ... }compare和equals都是两个抽象 方法,但是因为equals 是Object 类中的方法,所以可以不统计到本接口中抽象方法中,