Lambda表达式是实现轻量级命令模式的理想工具,它用函数式接口替代传统Command抽象,通过Runnable、Consumer等接口及闭包特性封装可传递、可延迟执行的逻辑,并支持泛型约束与枚举工厂实现类型安全和动态调度。

Lambda表达式是实现轻量级命令模式的理想工具——它把“做什么”(行为)从“谁来做”(调用者)中解耦,无需定义冗长的接口实现类或匿名内部类,直接将逻辑封装为可传递、可存储、可延迟执行的对象。
核心思路:用函数式接口替代Command抽象
传统命令模式需定义Command接口、多个实现类,而Java 8+中只需一个标准函数式接口(如Runnable、Consumer<t></t>、Function<t></t>或自定义接口),再用Lambda表达式即时构造命令实例:
- 无参无返回 → 用
Runnable:() -> doSomething() - 单输入无返回 → 用
Consumer<string></string>:name -> System.out.println("Hello " + name) - 双输入有返回 → 用
BiFunction<integer integer></integer>:(a, b) -> a * b
封装可复用的命令容器
定义一个通用命令管理器,支持注册、参数化执行和上下文绑定:
- 用
Map<string runnable></string>或Map<string consumer>></string>缓存命名命令 - 执行时传入实际参数,避免硬编码;例如:
commands.get("save").accept(new Object[]{user, timestamp}) - 结合闭包特性,捕获外部变量(如配置、服务对象),让Lambda自带执行环境:
final Database db = getDb(); commands.put("persist", data -> db.save(data))
动态执行与类型安全的平衡
Lambda本身不带运行时类型信息,但可通过泛型接口约束输入输出,确保编译期安全:
- 避免使用
Object或Supplier<object></object>等宽泛类型,优先选用Function<request response></request>这类语义明确的接口 - 对多态行为,用枚举+Lambda工厂统一管理:
enum CommandType { VALIDATE, ENRICH, NOTIFY };每个枚举值持有一个Function<data data></data> - 执行前可做简单校验(如非空、参数长度),但不必在Lambda体内重复判断——职责应由调用方或容器承担
实际场景示例:配置驱动的行为调度
假设从JSON加载一组操作指令,每条含action名和params,程序根据名称匹配预注册的Lambda并执行:
- 预注册:
commands.put("resize", (int w, int h) -> image.resize(w, h)) - 解析JSON后,反射提取参数并转为对应类型,再用
MethodHandle或简单switch分发到Lambda - 关键点:Lambda只专注业务逻辑,参数转换、错误兜底、日志埋点等横切关注由调度器统一处理










