java8函数式接口注解FunctionalInterface

Laughing
2022-10-03 / 0 评论 / 1,232 阅读 / 搜一下 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年03月15日,已超过384天没有更新,若内容或图片失效,请留言反馈。

函数式接口就是为Java 8Lambda表达式准备的,Java 8允许使用Lambda表达式创建函数式接口的实例,因此Java 8 专门增加了@FunctionalInterface

什么是函数式接口

我们提到如果接口中只有一个抽象方法(可以包含多个默认方法或多个 static 方法),那么该接口就是函数式接口。

FunctionalInterface作用

@FunctionalInterface就是用来指定某个接口必须是函数式接口,所以@FunInterface只能修饰接口,不能修饰其它程序元素。
看下一下面的方法

@FunctionalInterface
public interface BufferedReaderProcessor {

    /**
     * 静态方法
     */
    static void process() {
        System.out.println("process");
    }

    /**
     * 抽象方法
     *
     * @param bufferedReader
     * @return
     * @throws IOException
     */
    String process(BufferedReader bufferedReader) throws IOException;

    /**
     * 默认方法
     *
     * @param bufferedReader
     * @return
     * @throws IOException
     */
    default String process1(BufferedReader bufferedReader) throws IOException {
        return "";
    }
}

此时IDE是没有任何错误的(当然代码没有错误)

截止到此时,我们出程序中的@FunctionalInterface一丢丢的作用,其实@FunctionalInterface注解的作用只是告诉IDE检查这个接口,保证该接口只能包含一个抽象方法,否则就会编译出错。
如何理解一个抽象方法的含义。

是否能只不包含抽象方法?

我们继续修改刚才的代码,注释掉唯一的一个抽象方法


@FunctionalInterface
public interface BufferedReaderProcessor {

    /**
     * 静态方法
     */
    static void process() {
        System.out.println("process");
    }

//    /**
//     * 抽象方法
//     *
//     * @param bufferedReader
//     * @return
//     * @throws IOException
//     */
//    String process(BufferedReader bufferedReader) throws IOException;

    /**
     * 默认方法
     *
     * @param bufferedReader
     * @return
     * @throws IOException
     */
    default String process1(BufferedReader bufferedReader) throws IOException {
        return "";
    }
}

此时,IDE给了错误提示了:No target method found(没有找到目标方法),也就是说,一旦使用@FunctionalInterface注解接口,我们必须要提供一个抽象方法。

是否能提供多个抽象方法?

刚刚我们看到了,一旦接口@FunctionalInterface,我们接口必须包含抽象方法,那么是否能包含多个抽象方法呢,我们看下面代码。

@FunctionalInterface
public interface BufferedReaderProcessor {

    /**
     * 静态方法
     */
    static void process() {
        System.out.println("process");
    }

    /**
     * 抽象方法
     *
     * @param bufferedReader
     * @return
     * @throws IOException
     */
    String process(BufferedReader bufferedReader) throws IOException;

    /**
     * 抽象方法
     *
     * @return
     */
    String process1();

    /**
     * 默认方法
     *
     * @param bufferedReader
     * @return
     * @throws IOException
     */
    default String process1(BufferedReader bufferedReader) throws IOException {
        return "";
    }
}

此时ide提示Multiple non-overriding abstract methods found in XXX(找到多个非重载的抽象方法),也就是说,一个接口一旦注解了@FunctionalInterface就只能有一个抽象方法。

3

评论 (0)

取消