本文发表于 1886 天前,其中的信息可能已经事过境迁
Ai摘要
加载中...|
函数式接口,英文 Functional Interface。
1 什么是函数式接口
在 Java8 中,函数式接口指的是有且仅有一个抽象方法的接口。从 Lambda章节 得知,“接口或者抽象类,有且仅有一个方法需要实现,才能使用Lambda”,由此可见函数式接口可用于 Lambda 表达式。
1.1 基本语法
java
@FunctionalInterface
public interface ClassName {
returnType function(parameters);
}
1.2 示例
一个典型的示例就是线程的 Runnable 接口:
java
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
在 Lambda 中的使用:
java
Thread thread = new Thread(() -> System.out.println("thread run"));
可见,函数式接口可以看做是为 Lambda 表达式服务的,上述示例中,不加 @FunctionalInterface 注解,代码也没有问题。
2 Java 8 之前内置的函数式接口
java.lang.Runnable
:线程java.util.concurrent.Callable
:线程并发java.security.PrivilegedAction
:未知java.util.Comparator
:比较java.io.FileFilter
:文件过滤java.nio.file.PathMatcher
:路径匹配java.lang.reflect.InvocationHandler
:调用处理java.beans.PropertyChangeListener
:属性变更监听器java.awt.event.ActionListener
:事件监听器javax.swing.event.ChangeListener
:变更监听器
3 Java 8 中内置的函数式接口
Java 8 中,新增了“java.util.functin”包,用来支持函数式编程,里边的函数式接口有:
BiConsumer<T,U>
:接收两个泛型参数,无返回值BiFunction<T,U,R>
:接收两个泛型参数,返回泛型结果BinaryOperator<T>
:接收两个泛型参数,返回泛型结果,两个参数和返回值类型相同BiPredicate<T,U>
:接收两个泛型参数,返回 boolean 类型BooleanSupplier
:无参数,返回 boolean 类型Consumer<T>
:接收一个泛型参数,无返回值DoubleBinaryOperator
:接收两个 double 参数,返回 double 结果DoubleConsumer
:接收两个 double 参数,无返回值DoubleFunction<R>
:接收一个 double 参数,返回泛型结果DoublePredicate
:接收一个 double 参数,返回 boolean 类型DoubleSupplier
:无参数,返回 double 类型DoubleToIntFunction
:接收一个 double 参数,返回 int 类型DoubleToLongFunction
:接收一个 double 参数,返回 long 类型DoubleUnaryOperator
:接收一个 double 参数,返回 double 类型Function<T,R>
:接收一个泛型参数,返回泛型结果IntBinaryOperator
:接收两个 int 参数,返回 int 类型IntConsumer
:接收一个 int 参数,无返回值IntFunction<R>
:接收一个 int 参数,返回泛型结果IntPredicate
:接收一个 int 参数,返回 boolean 类型IntSupplier
:无参数,返回 int 类型IntToDoubleFunction
:接收一个 int 参数,返回 double 类型IntToLongFunction
:接收一个 int 参数,返回 long 类型IntUnaryOperator
:接收一个 int 参数,返回 int 类型LongBinaryOperator
:接收两个 long 参数,返回 long 类型LongConsumer
:接收一个 long 参数,无返回值LongFunction<R>
:接收一个 long 参数,返回泛型结果LongPredicate
:接收一个 long 参数,返回 boolean 类型LongSupplier
:无参数,返回 long 类型LongToDoubleFunction
:接收一个 long 参数,返回 double 类型LongToIntFunction
:接收一个 long 参数,返回 int 类型LongUnaryOperator
:接收一个 long 参数,返回 long 类型ObjDoubleConsumer<T>
:接收一个泛型和一个 double 参数,无返回值ObjIntConsumer<T>
:接收一个泛型和一个 int 参数,无返回值ObjLongConsumer<T>
:接收一个泛型和一个 long 参数,无返回值Predicate<T>
:接收一个泛型参数,返回 boolean 类型Supplier<T>
:无参数,返回泛型结果ToDoubleBiFunction<T,U>
:接收两个泛型参数,返回 double 类型ToDoubleFunction<T>
:接收一个泛型参数,返回 double 类型ToIntBiFunction<T,U>
:接收两个泛型参数,返回 int 类型ToIntFunction<T>
:接收一个泛型参数,返回 int 类型ToLongBiFunction<T,U>
:接收两个泛型参数,返回 long 类型ToLongFunction<T>
:接收一个泛型参数,返回 long 类型UnaryOperator<T>
:接收一个泛型参数,返回泛型结果,参数和返回值类型相同
4 限制与特殊情况
- FunctionalInterface 注解不加不影响代码的使用。
- 接口可以用数个默认方法,默认方法不影响函数式接口的使用。
- 抽象类是不能使用 FunctionalInterface 注解的。
- 如果 A 接口继承 B 接口,不实现原有方法,则 A 新增的方法只能是默认方法,A 才能使用 FunctionalInterface 注解。
- 如果 A 接口继承 B 接口,用默认方法实现了 B 未实现的方法,A 需要添加一个未实现的方法,A 才能使用 FunctionalInterface 注解。
Java 8 新特性系列 – 函数式接口https://blog.sixlab.cn/posts/2020/0529/java-8-function
赞赏博主
评论 隐私政策