原创

JAVA8系列教程-Functional接口

1.什么是Functional接口

功能接口是Java 8中的新增功能,它们在其中完全允许一种抽象方法这些接口也称为单一抽象方法接口(Single Abstract Method interfaces :SAM接口)

在Java 8中,功能接口也可以使用lambda表达式,方法引用和构造函数引用表示。

Java 8也引入了一个注解,即@FunctionalInterface,当您注解的接口违反了一种抽象方法的约定时,可将其用于编译器级错误。

让我们构建第一个功能接口:

功能接口定义
@FunctionalInterface
public interface MyFirstFunctionalInterface
{
    public void firstWork();
}

让我们尝试添加另一个抽象方法:

@FunctionalInterface
public interface MyFirstFunctionalInterface
{
    public void firstWork();
    public void doSomeMoreWork();   //error
}

以上将导致编译器错误,如下所示:

安慰
Unexpected @FunctionalInterface annotation
@FunctionalInterface ^ MyFirstFunctionalInterface is not a functional interface
multiple non-overriding abstract methods found in interface MyFirstFunctionalInterface


阅读更多:通用Functional接口

2.功能界面中的“应做”和“不应”

以下是功能界面中允许和不允许的事物的列表。

  • 如上所述,在任何功能接口中仅允许使用一种抽象方法在功能接口中不允许使用第二种抽象方法。如果我们删除@FunctionInterface批注,则可以添加另一个抽象方法,但是它将使接口成为非功能性接口。
  • 即使@FunctionalInterface省略注释,功能接口也有效它仅用于通知编译器在接口内部强制执行单个抽象方法
  • 从概念上讲,功能接口仅具有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。由于默认方法并不是抽象的,您可以自由地向您的功能接口添加默认方法

    以下是有效的功能接口:

    @FunctionalInterface
    public interface MyFirstFunctionalInterface
    {
        public void firstWork();
     
        default void doSomeMoreWork1(){
        //Method body
        }
     
        default void doSomeMoreWork2(){
        //Method body
        }
    }
  • 如果接口声明的抽象方法覆盖的公共方法之一java.lang.Object,则该方法也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有java.lang.Object或其他地方的实现。例如,即使Comparator声明了两个抽象方法,它也是一个功能接口。为什么?因为这些抽象方法“ equals()”之一具有publicObject类中的方法相同的签名

    例如,下面的接口是有效的功能接口。

    @FunctionalInterface
    public interface MyFirstFunctionalInterface
    {
        public void firstWork();
     
        @Override
        public String toString();                //Overridden from Object class
     
        @Override
        public boolean equals(Object obj);        //Overridden from Object class
    }

关于Java 8中的功能接口,到此为止

正文到此结束
本文目录