文章目录
什么是函数式接口
函数式接口是一个具有且仅有一个抽象方法(Abstract Method)的接口。在Java中,函数式接口被用于支持函数式编程的特性,允许将函数作为一等公民来传递和使用。函数式接口具有以下特点:
- 只包含一个抽象方法,但可以包含默认方法和静态方法。
- 可以使用
@FunctionalInterface
注解进行标识,以确保它符合函数式接口的规范。(该注解不是必需的)
这种接口可以通过Lambda表达式、方法引用来表示简洁的实现方式。函数式接口的设计允许将行为作为参数传递,使得代码更加简洁和可读。
函数式接口的语法
在 Java 中,函数式接口通常使用 @FunctionalInterface
注解进行标记,这样编译器可以检查该接口是否符合函数式接口的定义。如果一个接口声明了多个抽象方法,或者没有声明任何抽象方法,都不能被标记为函数式接口,否则会产生编译错误。
函数式接口的定义示例:
java
@FunctionalInterface
interface MyFunctionalInterface {
void myMethod(); // 抽象方法
// 允许存在默认方法
default void defaultMethod() {
// 实现代码
}
// 允许存在静态方法
static void staticMethod() {
// 实现代码
}
}
在函数式接口中,可以包含静态方法和默认方法,而这些方法与接口中的抽象方法不同。
- 抽象方法: 函数式接口必须包含且仅包含一个抽象方法。Lambda 表达式通过实现这个抽象方法来创建接口的实例。
- 默认方法: 默认方法是在接口中提供了一个默认的实现,可以在实现类中选择性地重写。Lambda 表达式可以忽略默认方法,因为它们不会影响接口的单一抽象方法的约束。
- 静态方法: 静态方法在接口中提供了一个静态的实用工具方法。与默认方法一样,Lambda 表达式不需要显式地实现接口中的静态方法,因为静态方法与实例方法无关。
函数式接口中的默认方法和静态方法的作用主要是组合 lambda 表达式
基本函数式接口
Java 8引入了一些常用的内置函数式接口,它们位于java.util.function
包中。这些函数式接口也在JDK API中大量使用,尤其是在集合框架和流API中。
函数式接口种类有 40 多种,但最基本的只有 supplier
、consumer
、predicate
、function
这四种。
函数式接口 | 抽象方法名 | 描述 | 其他方法 |
---|---|---|---|
Supplier |
T get(); |
不接受参数但返回一个结果的函数。通常用于创建对象。 | 无 |
Consumer<T> |
void accept(T t); |
接受一个参数并执行某种操作但不返回结果的函数。 | andThen |
Predicate<T> |
boolean test(T t); |
接受一个参数并返回布尔值的函数,用于条件判断。 | and , or , negate , isEqual |
Function<T,R> |
R apply(T t); |
接受一个参数并返回一个结果的函数。通常用于在Stream API中将对象映射到其他对象 | andThen , compose , identity |
Comparator |
int compare(T o1, T o2); |
接受两个参数并返回一个整数。通常用于排序 | |
Callable<V> |
V call(); |
不接受参数但返回一个结果的函数,用于并发任务 | 无 |
Runnable |
void run(); |
不接受参数且不返回结果的函数,用于并发任务 | 无 |
定制化函数接口
在这最基本的函数式接口的基础上,还有一些定制化的函数式接口,适用于特定的需求或操作::
- 部分函数式接口接受的参数更多, 比如
BiConsumer
- 部分函数式接口避免了自动装箱和自动拆箱的开销, 以采用的类型命名,比如
IntSupplier
函数式接口 | 抽象方法名 | 描述 | 其他方法 |
---|---|---|---|
IntSupplier |
int getAsInt(); |
不接受参数但返回一个结果的函数。避免了自动装箱和自动拆箱的开销。 | 无 |
BiConsumer |
void accept(T t, U u); |
接受两个参数并执行某种操作但不返回结果的函数 | andThen |
BiPredicate<T, U> |
boolean test(T t, U u); |
接受两个参数并返回布尔值的函数,用于条件判断。 | and , or , negate , isEqual |
BiFunction<T, U, R> |
R apply(T t, U u); |
接受两个参数并返回一个结果的函数 | andThen |
更多的细节查看 Using Lambdas Expressions in Your Application - Dev.java
参考资料
Using Lambdas Expressions in Your Application - Dev.java
Java 8 新特性:函数式接口(Functional Interface)_java functionalinterface-CSDN博客