函数式接口通过默认方法支持链式组合与不可变性,泛型提升复用性,优先使用java.util.function内置接口,仅在语义不匹配时定义业务专用接口,并借助lambda和方法引用实现灵活装配。

函数式接口支持组合式扩展
函数式接口天然适合链式组合,尤其通过默认方法实现行为拼接。比如 Predicate 的 and()、or()、negate(),或自定义接口中添加 andThen() 方法:
- 用
default方法封装通用逻辑,避免每次重复写 Lambda - 组合操作不改变原对象,保持不可变性,利于并发安全
- 例如:一个
Validator<string></string>接口可提供and(Validator)方法,把多个校验规则串成一条流水线
用泛型和类型参数提升复用能力
设计时优先采用泛型,让同一接口适配不同数据类型。Java 标准库中的 Function<t r></t>、Consumer<t></t> 就是典型范例:
- 避免为每种类型单独定义接口(如
StringHandler、IntHandler) - 类型参数可约束输入输出,编译期就能捕获不匹配问题
- 必要时配合原始类型特化接口(如
IntPredicate)优化性能,但不要过早优化
内置接口优先,减少自定义负担
绝大多数场景下,java.util.function 中的四大核心接口及其变体已覆盖足够多用途:
-
Function处理转换逻辑(如字符串转数字、对象映射) -
Predicate表达条件判断(过滤、校验、开关控制) -
Consumer执行副作用操作(日志、通知、持久化) -
Supplier延迟获取值(懒加载、随机数、时间戳)
只有当语义无法被现有接口准确表达时,再定义带明确业务名称的函数式接口,比如 PaymentStrategy 或 RetryPolicy。
配合 Lambda 与方法引用灵活装配
扩展性不仅体现在接口定义,更体现在使用时的装配自由度:
- 业务模块只需传入符合接口签名的 Lambda 或方法引用,无需继承或实现类
- 运行时动态替换策略(如不同排序规则、不同序列化器),降低耦合
- 结合 Spring 的
@FunctionalBean(5.3+)或手动注册,实现函数级 Bean 管理
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











