java中用lambda表达式实现策略模式的核心是将算法逻辑变为可传递、可复用的函数值,省去接口+实现类模板;策略接口需为函数式接口,如discountstrategy,不同规则直接用lambda表示;策略作为参数传入方法,上下文不依赖具体实现;可集中存于map或枚举中按key动态切换;还能结合stream与function.andthen链式组合。

Java 中用 Lambda 表达式实现策略模式解耦,核心是把“算法逻辑”变成可传递、可复用、无类文件的函数值,跳过接口+实现类的模板代码,让变化点直接落在行为本身。
用函数式接口定义策略契约
策略接口必须是函数式接口(仅一个抽象方法),无需额外标注 @FunctionalInterface 也能被 Lambda 使用,但显式标注更清晰:
- 定义简洁接口,例如:interface DiscountStrategy { BigDecimal apply(BigDecimal price); }
- 避免写
RegularDiscountImpl、VipDiscountImpl等一堆类 - 同一接口下,不同业务规则直接用 Lambda 表达式表示:比如
price -> price.multiply(0.9)或price -> price.subtract(TEN)
策略作为参数动态传入
不再依赖工厂类或 if-else 分支选择策略,而是把策略当作普通参数传递:
- 方法签名支持函数式参数:
void processOrder(Order order, DiscountStrategy strategy) - 调用时即插即用:
processOrder(order, p -> p.multiply(0.85)) - 上下文类(如 Service)不持有具体策略对象,也不感知策略来源,只面向接口编程
策略集中管理与运行时切换
把多个 Lambda 策略预存到 Map 或枚举中,按 key 查找,灵活替换:
- 构建策略容器:
Map<string discountstrategy> strategies = Map.of("vip", p -> p.multiply(0.8), "promo", p -> p.subtract(new BigDecimal("30")))</string> - 运行时根据配置/用户类型取用:
strategies.get(userType).apply(order.getPrice()) - 新增策略只需加一行 Lambda,无需改结构、不触发编译、不影响已有逻辑
结合 Stream 和组合操作增强表达力
当策略需要链式执行(如校验→计算→日志),Lambda 可自然融入函数式流水线:
- 用
List<function t>></function>表示处理步骤,再用Function::andThen合成完整流程 - 例如:
steps.stream().reduce(Function.identity(), Function::andThen).apply(order) - 每一步都可单独提取为变量复用,也可按需增删,解耦粒度比传统策略类更细
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











