06. Java8 函数式接口

318 阅读2分钟

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);
    ...
    }
    

    compareequals 都是两个抽象 方法,但是因为equals 是Object 类中的方法,所以可以不统计到本接口中抽象方法中,