首页 > java > jdk8 > 2.JDK8函数式接口

2.JDK8函数式接口

JDK8.0开始新增了函数式接口.

1 函数式接口定义

java 函数式接口(Functional Interface)是指只有一个抽象方法的接口.这种类型的接口也称为SAM(Single Abstract Method).

2 函数式接口应用场景

函数式接口主要应用在Lambda表达式上.如定义了一个函数式接口如下:

/**
 * 大屎蛋教程网 http://dashidan.com
 */
@FunctionalInterface
interface GreetingService
{
    void sayMessage(String message);
}

那么就可以使用Lambda表达式来表示该接口的一个实现.

/**
 * 大屎蛋教程网 http://dashidan.com
 */
GreetingService greetService1 = message -> System.out.println("Hello " + message);
JDK8.0之前一般是用匿名类实现的.

3 @FunctionalInterface注解

JDK8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查.加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错.例:

/**
 * 大屎蛋教程网 http://dashidan.com
 */
@FunctionalInterface
interface GreetingService
{
    void sayMessage(String message);
}

@FunctionalInterface注解

加不加@FunctionalInterface对于接口是不是函数式接口没有影响,该注解提醒编译器去检查该接口是否仅包含一个抽象方法. 加上该注解表示该接口中只能有一个抽象方法.如果接口中包含了两个或以上的抽象方法, 则违反了函数式接口的定义.采用Eclipse或者Intelij IDEA等IDE会提示错误.

4 java函数式接口里允许定义default方法

default方法也是JDK8新增语法特性.接口中使用该关键字表示该方法是可以在接口中直接实现该方法.函数式接口里是可以包含default方法,因为default方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的.如下代码不会报错:

/**
 * 大屎蛋教程网 http://dashidan.com
 */
@FunctionalInterface
interface GreetingService
{
    void sayMessage(String message);

    default void doSomeMoreWork1()
    {
        // Method body
    }

    default void doSomeMoreWork2()
    {
        // Method body
    }
}

5 java函数式接口里允许定义静态方法

函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的.如下代码不会报错:

/**
 * 大屎蛋教程网 http://dashidan.com
 */
@FunctionalInterface
interface GreetingService
{
    void sayMessage(String message);
    static void printHello(){
        System.out.println("Hello");
    }
}

6 函数式接口里允许定义java.lang.Object里的public方法

函数式接口里是可以包含Object里的public方法.这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法).因为任何一个函数式接口的实现,默认都继承了Object类,包含了来自java.lang.Object里对这些抽象方法的实现.如下代码不会报错:

/**
 * 大屎蛋教程网 http://dashidan.com
 */
@FunctionalInterface
interface GreetingService
{
    void sayMessage(String message);

    @Override
    boolean equals(Object obj);
}

7 JDK中的函数式接口举例

java.lang.Runnable,

java.awt.event.ActionListener,

java.util.Comparator,

java.util.concurrent.Callable

java.util.function包下的接口,如Consumer、Predicate、Supplier等

8 参考文章

http://www.linuxidc.com/Linux/2016-09/135437.htm

http://www.techempower.com/blog/2013/03/26/everything-about-java-8/

转载请保留原文链接.