当前位置: 首页 > 工具软件 > interface > 使用案例 >

FunctionalInterface注解

邹宏峻
2023-12-01

@FunctionalInterface 注解用来标识某个接口是函数式接口(所谓函数式接口就是指对于一个接口只能有一个抽象方法。这种类型的接口也称为SAM(Single Abstract Method)接口)。

定义及使用

FunctionalInterface注解定义如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {

}

FunctionalInterface 注解只能作用于接口,该注解主要用于编译级错误检查。使用@FunctionalInterface注解修饰接口后,如果写的接口不符合函数式接口规范,则编译器会报错。
正确示例如下:

@FunctionalInterface
public interface CustomInferface {
    void test();
}

错误示例如下:

@FunctionalInterface
public interface CustomInferface {
    void test1();
    void test2();
}

上述示例会有如下编译异常提示:

Multiple non-overriding abstract methods found in interface xxxInferface

分类

根据声明方法的参数和返回值的不同,Functional Interface可以分为很多种,这里整理了java.util.function包中已定义的基类函数式接口。在实际开发中,应优先复用已定义且语义相同的函数式接口(避免重复造轮子)。

Function:一个参数且有返回值

Function接口声明了一个可接收一个参数且有返回值的方法。源码如下:

@FunctionalInterface
public interface Function<T, R> {
    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
    ...
}

如果需要指定参数或返回值的类型,则可使用Function接口的衍生接口,如IntFunction(指定入参是整数)、DoubleFunction(指定入参是浮点数)、ToLongFunction(指定返回值是长整数)、ToDoubleFunction(指定返回值是浮点数)、DoubleToIntFunction(指定入参是浮点数、返回值是整数)、IntToDoubleFunction(指定入参是整数、返回值是浮点数)等。

BiFunction:两个参数且有返回值

BiFunction接口声明了一个可接收两个参数且有返回值的方法。源码如下:

@FunctionalInterface
public interface BiFunction<T, U, R> {
    /**
     * Applies this function to the given arguments.
     *
     * @param t the first function argument
     * @param u the second function argument
     * @return the function result
     */
    R apply(T t, U u);
    ...
}

如果需要指定参数或返回值的类型,则可使用类似Function接口的衍生接口,如ToIntBiFunction、ToLongBiFunction、ToDoubleBiFunction等。与Function接口不同的是,BiFunction没有指定入参类型的衍生接口。

Supplier:无参但有返回值

Supplier接口声明了一个无参但有返回值的方法。源码如下:

@FunctionalInterface
public interface Supplier<T> {
    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

如果需要指定返回值的类型,则可像Function接口一样,使用Supplier衍生接口,如IntSupplier、LongSupplier、DoubleSupplier等。

Consumer:一个参数但无返回值

Consumer接口声明了一个参数但无返回值的方法。源码如下:

@FunctionalInterface
public interface Consumer<T> {
    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}

如果需要指定入参的类型,则可像Function接口一样,使用Consumer衍生接口,如IntConsumer、LongConsumer、DoubleConsumer等。

Predicate:一个参数且返回boolean值

Predicate接口声明了一个参数且返回值是boolean的方法。源码如下:

@FunctionalInterface
public interface Predicate<T> {
    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
    ...
}

类似地,BiPredicate接口声明了两个参数且返回值是boolean的方法。同时,如果需要指定入参的类型,则可像Function接口一样,使用Predicate衍生接口,如IntPredicate、LongPredicate、DoublePredicate等。

XxxOperator:参数和返回值相同类型

XxxOperator表示一类接口,这类接口均声明了参数和返回值类型相同的方法。这里给出参数和返回值类型相同,且入参是一个的接口的源码:


@FunctionalInterface
public interface IntUnaryOperator {
    /**
     * Applies this operator to the given operand.
     *
     * @param operand the operand
     * @return the operator result
     */
    int applyAsInt(int operand);
}

类似地,XxxBinaryOperator接口声明了参数和返回值相同类型,且参数是两个的方法。同时,如果需要指定参数或返回值的类型,则可像Function接口一样,使用XxxOperator或XxxBinaryOperator衍生接口,如LongUnaryOperator、DoubleUnaryOperator、LongBinaryOperator、DoubleBinaryOperator等。

参考

jdk 1.11.6源码
https://www.cnblogs.com/chenpi/p/5890144.html JAVA 8 函数式接口 - Functional Interface
https://www.cnblogs.com/flydean/p/java-functional-interface.html java中functional interface的分类和使用

 类似资料: