@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接口声明了一个可接收一个参数且有返回值的方法。源码如下:
@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接口声明了一个可接收两个参数且有返回值的方法。源码如下:
@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接口声明了一个无参但有返回值的方法。源码如下:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
如果需要指定返回值的类型,则可像Function接口一样,使用Supplier衍生接口,如IntSupplier、LongSupplier、DoubleSupplier等。
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的方法。源码如下:
@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表示一类接口,这类接口均声明了参数和返回值类型相同的方法。这里给出参数和返回值类型相同,且入参是一个的接口的源码:
@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的分类和使用