Java中接口要配合Lambda表达式使用,关键在于必须是函数式接口——即有且仅有一个抽象方法的接口;@FunctionalInterface注解强制校验该约束,java.util.function包提供常用函数式接口,自定义时只需满足单抽象方法即可,Lambda本质是为该抽象方法提供实现体。

Java 中接口要配合 Lambda 表达式使用,关键在于它必须是函数式接口——即有且仅有一个抽象方法的接口。Lambda 表达式不是随便套在任意接口上的,它只认准这种“单抽象方法”的契约。
函数式接口是 Lambda 的唯一入口
只有被设计为函数式接口的接口,才能用 Lambda 表达式实现。这个约束由 @FunctionalInterface 注解强制保障:
- 编译器会检查:接口中是否真只有一个抽象方法(Object 类的 public 方法如 toString() 不算)
- 允许存在多个默认方法(default)和静态方法(static),它们不破坏函数式语义
- 没加注解也不影响运行,但加了能提前暴露错误,比如误加第二个抽象方法时编译直接失败
标准函数式接口直接开箱即用
Java 8 起,java.util.function 包提供了常用函数式接口,无需自己定义就能写 Lambda:
- Runnable:无参无返回 → () -> System.out.println("run")
-
Consumer
:接收一个参数,不返回 → (s) -> System.out.println(s) -
Supplier
:无参,返回值 → () -> "hello" -
Function
:接收 T,返回 R → (x) -> x * 2 -
Predicate
:接收 T,返回 boolean → (n) -> n > 0
自定义函数式接口也很简单
只要满足“一个抽象方法”,就可以按需定制。例如定义一个字符串处理器:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
@FunctionalInterface
interface StringTransformer {
String transform(String input);
// 可以加 default 方法,不影响函数式身份
default boolean isEmpty(String s) { return s == null || s.trim().isEmpty(); }
}然后直接用 Lambda 实现:
- StringTransformer upper = s -> s.toUpperCase();
- StringTransformer trim = String::trim;(方法引用,本质也是 Lambda)
- 再调用:upper.transform("hello") → "HELLO"
Lambda 本质是接口抽象方法的实现体
写 Lambda 不是在创建新类型,而是在为函数式接口的唯一抽象方法提供具体逻辑。JVM 会在运行时将 Lambda 编译成该接口的实例,就像匿名内部类那样,但更轻量、更高效。
比如 Runnable r = () -> doSomething();,等价于 new Runnable() { public void run() { doSomething(); } },只是语法更紧凑、意图更直白。

















