java函数式接口配合策略模式的核心是用function、predicate等替代if-else,将条件逻辑下沉为可配置、可复用的策略对象;通过map预注册策略实现运行时查表分发,并结合predicate支持复合条件过滤,兼顾简洁性与扩展性。

Java 函数式接口配合策略模式,核心是用 Function、BiFunction、Predicate 或自定义函数式接口替代硬编码的 if-else 分支,把“条件判断逻辑”下沉为可配置、可复用、可测试的策略对象。
用函数式接口定义策略契约
避免定义一堆空泛的 Strategy 抽象类或接口,直接使用 JDK 内置函数式接口,或声明简洁的自定义接口(带 @FunctionalInterface):
@FunctionalInterface interface DiscountPolicy { double apply(double originalPrice); }- 或复用
Function<double double></double>表示“原价 → 折后价”的映射关系 - 关键点:接口方法参数和返回值需覆盖业务主流程所需数据,不强求“统一入参对象”
用 Map 预注册策略,运行时查表分发
把 if-else 的分支条件转为 key,对应策略作为 value 存入 Map。推荐用 ConcurrentHashMap 或静态不可变 map 提升安全性和性能:
- 例如按会员等级选折扣策略:
Map<string function double>> policyMap = Map.of( "GOLD", price -> price * 0.8, "SILVER", price -> price * 0.9, "DEFAULT", Function.identity() );</string> - 调用时只需
policyMap.getOrDefault(level, policyMap.get("DEFAULT")).apply(price) - 新增策略不改原有代码,只需往 map 新增键值对或通过配置加载
结合 Predicate 实现条件前置过滤
当策略选择依赖复合条件(如“订单金额 > 100 且用户注册满30天”),可用 Predicate 封装判断逻辑,再与策略绑定:
- 定义
record StrategyRule(Predicate<order> condition, Function<order double> strategy) {}</order></order> - 遍历规则列表,首个
condition.test(order)为 true 的即命中策略 - 比嵌套 if-else 更易读、易单元测试,也支持动态规则编排(如从数据库加载)
避免常见陷阱
不是所有 if-else 都适合这样重构;要注意边界:
- 分支极少(仅2~3个)、逻辑极简单时,强行抽象反而增加理解成本
- 策略间有强状态依赖或执行顺序要求时,map 查表可能掩盖时序问题,此时应保留显式流程控制
- lambda 表达式里不要写复杂业务逻辑——它只是入口,具体实现应抽到独立方法或 service 中
- 注意 null 安全:map 的 key 可能为空,建议用
Objects.requireNonNull或默认兜底策略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











