Lambda责任链通过UnaryOperator函数组合实现,用andThen串联处理步骤,无需继承和successor引用,支持动态组装、条件跳过与线程安全复用。

用Lambda表达式实现责任链,核心是把每个处理步骤变成函数,再用 andThen 串起来,避免手动维护 successor 引用和递归调用逻辑。它不依赖抽象类和继承,更轻量、更直观,特别适合配置化、临时组合的处理流程。
用 Function 或 UnaryOperator 定义单步处理
每个环节封装为一个函数:输入一种类型,输出同类型(或兼容类型)。推荐使用 UnaryOperator<T>(专用于 T→T 的函数),语义清晰,代码简洁。
UnaryOperator<String> header = s -> "From Raoul: " + s;UnaryOperator<String> spellFix = s -> s.replace("labda", "lambda");UnaryOperator<String> lengthTag = s -> s + " (len=" + s.length() + ")";
用 andThen 串联形成执行链
andThen 是 Function 和 UnaryOperator 接口内置的方法,返回一个新的组合函数——先执行当前函数,再把结果传给参数函数。
- 链式写法:
UnaryOperator<String> pipeline = header.andThen(spellFix).andThen(lengthTag); - 执行只需一次调用:
String result = pipeline.apply("Aren't labdas sexy?"); - 结果自动按顺序流转:header → spellFix → lengthTag,无需 if(successor != null) 判断
支持动态组装与条件跳过
链不是硬编码死的,你可以根据变量或配置决定是否加入某环节。
- 比如只在 debug 模式下加日志环节:
UnaryOperator<String> step = isDebug ? s -> { System.out.println("Processing: "+s); return s; } : s -> s; - 用 Stream 或 List 收集多个处理器,再用
reduce合并:UnaryOperator<String> fullChain = processors.stream().reduce(UnaryOperator.identity(), UnaryOperator::andThen); - 也可用 Optional 控制某环节是否启用,避免空指针或冗余判断
与传统责任链的关键区别
传统方式靠对象持有 successor 引用,靠 handle() 方法递归分发;Lambda 方式靠函数组合生成新函数,执行时是一次性 apply,无运行时链遍历开销。
- 无状态:每个 Lambda 是纯函数(推荐),不依赖实例字段,线程安全
- 易测试:每个环节可单独传参验证,不用构造整条链
- 易复用:同一处理器可被不同链复用,比如
spellFix可同时用于邮件、评论、日志等场景

















