Java函数式接口本质是仅含一个抽象方法的接口,用于承载Lambda表达式和方法引用;必须满足单抽象方法条件,可含default、static及Object重写方法,@FunctionalInterface注解提供编译期校验与设计意图声明。

Java 函数式接口本质是“只带一个抽象方法”的接口,它是 Lambda 表达式和方法引用的法定“落脚点”。写对了接口,才能让 lambda 有地方可去;用对了接口,代码才真正简洁有力。
函数式接口必须满足的硬性条件
不是随便标个 @FunctionalInterface 就算数——编译器会严格检查:
- 接口里只能有且仅有一个未实现的抽象方法(public abstract 方法)
- 可以任意添加 default 方法(已有实现)和 static 方法(属于接口本身)
- 重写 Object 类的方法(如 equals()、toString()、hashCode())不计入抽象方法数量
- 一旦加了 @FunctionalInterface 注解却违反上述规则,编译直接报错
为什么必须用 @FunctionalInterface 注解
这个注解不是装饰,而是契约声明:
- 它告诉其他开发者:“此接口专为函数式设计,请勿随意添加第二个抽象方法”
- 它启用编译期校验,避免后期因误加方法导致所有 lambda 调用崩溃
- 即使不加该注解,只要满足“单抽象方法”,JVM 仍视其为函数式接口;但加了才体现设计意图并获得安全防护
自定义函数式接口的典型写法
比如要封装一个“根据两个整数计算结果”的操作:
@FunctionalInterface
interface Calculator {
int apply(int a, int b); // 唯一抽象方法
<pre class="brush:php;toolbar:false;">// 允许默认方法(不影响函数式特性)
default int multiplyByTwo(int x) {
return x * 2;
}
// 允许静态方法
static boolean isPositive(int n) {
return n > 0;
}
}
使用时可直接传 lambda:
Calculator add = (x, y) -> x + y; Calculator max = Math::max; // 方法引用也合法 System.out.println(add.apply(3, 5)); // 输出 8
对接 Java 内置函数式接口快速上手
不必重复造轮子。JDK 已提供常用场景的标准化接口:
- Runnable:无参无返回 → () -> System.out.println("ok")
-
Supplier
:无参有返回 → () -> new Date() -
Consumer
:有参无返回 → s -> System.out.println(s.length()) -
Predicate
:有参返回 boolean → s -> s.startsWith("A") -
Function
:有参有返回 → String::length 或 s -> s.toUpperCase()
这些接口都自带 @FunctionalInterface,可直接用于 lambda 或方法引用,语义清晰、类型安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











