函数式接口在框架扩展中用于解耦行为与结构,支持策略注入、统一回调、dsl api、动态组合四大场景,使用户能以lambda极简方式扩展逻辑而不修改框架源码。

函数式接口在框架扩展中主要用来解耦行为与结构,让框架使用者能以极简方式注入自定义逻辑,而无需继承、重写或修改框架核心代码。
作为可插拔的策略入口
框架常把“变化点”抽象成函数式接口,比如一个通用的数据校验框架,不硬编码校验规则,而是暴露一个 Predicate<object></object> 参数:
- 调用方传入
x -> x instanceof String && !((String)x).trim().isEmpty(),即插即用字符串非空校验 - 框架内部只负责执行该判断,不关心具体怎么判——校验逻辑完全由使用者提供
- 后续新增邮箱格式校验、数字范围校验等,都不需要改框架源码,只需换一个 Lambda
统一回调机制的设计基础
框架对外提供事件通知能力时(如“任务完成前”“配置加载后”),用函数式接口定义钩子(Hook):
- 定义
@FunctionalInterface interface OnConfigLoaded { void onLoaded(Config cfg); } - 框架初始化时预留
setOnConfigLoaded(...)方法,接受该接口实例 - 使用者用
framework.setOnConfigLoaded(cfg -> log.info("Loaded: {}", cfg))注册,无需实现监听器类或管理生命周期 - 多个模块可各自注册独立回调,互不影响,框架只负责触发
构建类型安全的 DSL 风格 API
高级框架(如 Spring Boot 的 WebMvcConfigurer、MyBatis 的 TypeHandler 扩展)大量依赖函数式接口支撑链式配置:
- 例如自定义序列化策略:框架提供
registerSerializer(Class<t> type, Function<t string> serializer)</t></t> - 使用者调用
registerSerializer(User.class, u -> "{id:" + u.getId() + "}"),语义清晰,类型推导完整 - 相比传统工厂模式或 SPI 加载,函数式接口避免了额外类定义、配置文件和反射开销
支持运行时动态行为组合
框架允许用户将多个函数式接口实例组合使用,形成复合行为:
- 利用
andThen(Function)、and(Predicate)、andThen(Consumer)等默认方法 - 例如权限校验框架接收
Predicate<request></request>列表,内部用predicates.stream().reduce(Predicate::and).orElse(x -> true)合并所有规则 - 用户可自由叠加 IP 白名单、登录态检查、角色匹配等独立逻辑,顺序与组合方式完全可控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











