Lambda表达式必须依托函数式接口使用,二者是一体两面关系;函数式接口需有且仅有一个抽象方法,可加@FunctionalInterface注解增强健壮性,支持默认/静态方法;Java内置Consumer、Function、Predicate、Supplier等常用接口,自定义接口也须满足单一抽象方法规则。

Lambda 表达式不能独立存在,必须依托于函数式接口才能被使用。它们是一体两面的关系:函数式接口定义“要做什么”,Lambda 表达式提供“具体怎么做”。
函数式接口是 Lambda 的唯一合法容器
Java 规定,只有当一个接口满足“有且仅有一个抽象方法”时,才可作为 Lambda 的目标类型。这个接口就是函数式接口。
- 编译器会根据上下文自动推断该接口类型,例如传给 Thread 构造器的 Lambda,默认匹配 Runnable 接口
- @FunctionalInterface 注解不是必需的,但加上后能防止误加第二个抽象方法,提升代码健壮性
- 接口中允许有默认方法、静态方法、甚至重写 Object 的方法(如 toString),这些都不影响其函数式接口身份
Lambda 是函数式接口的简洁实现方式
传统用匿名内部类实现接口,要写一堆模板代码;Lambda 把注意力完全聚焦在方法逻辑本身。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 比如 Runnable r = () -> System.out.println("go"); 直接对应 run() 方法的实现
- 再如 Predicate
p = s -> s.length() > 5; 等价于实现了 test(String) 方法 - 参数类型通常可省略,因为编译器能从接口方法签名中推导出来
常用内置函数式接口与典型用法
java.util.function 包提供了开箱即用的通用接口,覆盖大多数场景:
-
Consumer
:接受一个参数,不返回结果 —— 适合 forEach、打印、修改等操作
例:list.forEach(item -> System.out.println(item)); -
Function
:接受一个参数,返回一个结果 —— 常用于 map 转换
例:list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList()); -
Predicate
:接受一个参数,返回 boolean —— 主要用在 filter
例:list.stream().filter(s -> s.startsWith("A")).toList(); -
Supplier
:无参,返回一个结果 —— 适合延迟创建对象或默认值
例:Optional.ofNullable(value).orElseGet(() -> new DefaultObj());
自定义函数式接口也很简单
只要符合单一抽象方法规则,自己定义的接口也能和 Lambda 配合使用。
- 声明接口时建议加 @FunctionalInterface,便于编译检查
- 例如定义一个计算接口:
@FunctionalInterface
interface Calculator {
int compute(int a, int b);
} - 然后直接用 Lambda 实现:
Calculator add = (x, y) -> x + y;
int result = add.compute(3, 4); // 得到 7
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










