java中用lambda实现策略模式本质是将行为作为参数传递,省去实现类;策略接口需为函数式接口,如validationstrategy,可用lambda或方法引用直接实例化,上下文类保持不变但构造更灵活,适合简单场景,复杂场景可结合spring或枚举。

Java 中用 Lambda 实现策略模式,本质是把“行为”当作参数传进来,省去一堆实现类。它不改变策略模式的三层结构(接口、实现、上下文),只是让“实现”变得更轻——直接用一行表达式代替一个类。
策略接口必须是函数式接口
这是前提。接口只能有一个抽象方法,且建议加 @FunctionalInterface 注解防误改。比如验证字符串的策略:
public interface ValidationStrategy {
boolean execute(String s);
}
这个接口天然适配 Predicate
Lambda 替代具体策略类
原来要写两个类:IsAllLowerCase 和 IsNumeric;现在直接传表达式:
-
new Validator(s -> s.matches("[a-z]+"))→ 全小写校验 -
new Validator(s -> s.matches("\d+"))→ 纯数字校验 -
new Validator(String::isBlank)→ 方法引用,更简洁
没有 new 类、没有包路径、没有编译文件,逻辑即代码,改起来也只动这一行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
上下文保持不变,但构造更灵活
上下文类(如 Validator)还是持有策略接口,只是构造时不再依赖具体实现类:
public class Validator {
private final ValidationStrategy strategy;
public Validator(ValidationStrategy strategy) {
this.strategy = strategy;
}
public boolean validate(String s) {
return strategy.execute(s);
}
}
调用方完全无感:传的是 Lambda 还是传统实现类,对它来说没区别。
和 Spring 或枚举配合更实用
纯 Lambda 适合简单、临时、逻辑不复用的场景。如果策略较多或需注入 Spring Bean(比如带数据库操作的校验),推荐结合:
-
Spring Bean 方式:每个策略写成
@Service类,用@Qualifier或工厂方法按 key 获取 - 枚举 + Lambda:枚举值自带策略字段,初始化时赋值 Lambda,既集中管理,又避免类爆炸
例如:Status.PAID -> order -> {扣库存(); 发短信();},比 if-else 清晰,比多个@Service 轻量。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










