函数式接口需满足“只含一个抽象方法”的硬约束,@FunctionalInterface 注解用于编译期校验;java.util.function 包提供43个内置接口,按消费型、供给型、转换型、判断型、基础类型特化版分类掌握;Function 的 andThen、compose 和 identity 是组合关键。

直接按功能模块分块读,别从头到尾线性通读。
先抓核心定义与判定规则
重点理解“只含一个抽象方法”这个硬约束,以及 @FunctionalInterface 注解的作用——它不是语法必需,但加了编译器会帮你检查是否真只有一个抽象方法。注意默认方法、静态方法、Object 的 public 方法(如 toString)都不算在内。读到这里就该能判断一个接口是不是函数式接口了。
再分类看内置接口用途
Java 8 在 java.util.function 包里提供了 43 个常用函数式接口,不用全背,按角色分组掌握:
-
消费型:Consumer
(接受 T,不返回)、BiConsumer (接受两个参数)——适合做副作用操作,比如打印、存库 -
供给型:Supplier
(无参,返回 T)——适合延迟创建对象,如 new Random()::nextInt -
转换型:Function
(T→R)、UnaryOperator (T→T)、BiFunction (两参→结果)——数据映射主力,DTO 转 Entity 就靠它 -
判断型:Predicate
(T→boolean)、IntPredicate(int→boolean)——filter 场景标配,支持 and/or/negate 链式组合 - 基础类型特化版:ToIntFunction、LongConsumer 等——避免装箱拆箱,性能敏感场景优先选
重点练 Function 的组合能力
Function 接口的 andThen() 和 compose() 是实战高频点:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- andThen:先执行当前函数,再执行传入函数。例如:str -> str.length() andThen len -> len % 2 == 0,实现“判断字符串长度是否为偶数”
- compose:先执行传入函数,再执行当前函数。适合前置预处理,比如把 null 安全包装提前
- 别忽略 identity():它返回输入本身,常用于默认策略兜底或链式构造起点
结合 Stream 和实际场景验证
函数式接口不是孤立概念,它活在真实调用中。拿 Stream 操作反推接口用法:
-
stream.filter(s -> s.contains("a")) → 实际类型是 Predicate
-
stream.map(s -> s.toUpperCase()) → 实际类型是 Function
-
list.forEach(System.out::println) → 实际类型是 Consumer
边写 Stream 边看 IDE 提示的泛型类型,比死记接口签名更直观。

















