162. Java Lambda 表达式 - Consumer 的链式组合

162. Java Lambda 表达式 - Consumer 的链式组合

在 Java 中,Consumer<T> 是一个非常常用的函数式接口,它表示一个接受单个输入参数并执行某种操作,但不返回结果的函数。

从 Java 8 开始,Consumer 提供了一个默认方法 ------ andThen(),可以用于链接多个消费者操作,让多个操作按顺序执行,形成"操作链"。


🔧 基本语法:

java 复制代码
Consumer<T> combined = firstConsumer.andThen(secondConsumer);

这个链式结构表示:当调用 combined.accept(value) 时,会先执行 firstConsumer.accept(value),然后再执行 secondConsumer.accept(value)。


🧪 示例:日志记录 + 控制台输出

java 复制代码
Logger logger = Logger.getLogger("MyApplicationLogger");

Consumer<String> log = message -> logger.info(message);         // 记录日志
Consumer<String> print = message -> System.out.println(message); // 控制台输出

Consumer<String> logAndPrint = log.andThen(print);

然后,你可以这样使用它:

java 复制代码
logAndPrint.accept("系统启动成功!");

✅ 效果:

  • 会 先写入日志 :logger.info(...)
  • 然后 打印到控制台 :System.out.println(...)

📌 注意事项:

  • andThen() 执行顺序是:先执行前一个 Consumer,再执行后一个。
  • 如果第一个消费者抛出异常,第二个消费者不会被执行。
  • 适用于需要"多个副作用操作"的场景,比如:
    • 日志 + 打印
    • 本地记录 + 网络上报
    • 修改数据 + UI 刷新 等等

💡 小练习

写一个组合消费者 saveAndNotify,用于:

  1. 保存一条消息到数据库(模拟用 System.out.println("保存:"+msg));
  2. 然后发送通知(模拟用 System.out.println("通知:"+msg))。
java 复制代码
Consumer<String> save = msg -> System.out.println("保存:" + msg);
Consumer<String> notify = msg -> System.out.println("通知:" + msg);

Consumer<String> saveAndNotify = save.andThen(notify);

saveAndNotify.accept("新用户注册");

🎯 总结

特性 说明
✅ andThen() 默认方法 支持消费者链式组合
✅ 顺序执行 前者先执行,后者后执行
⚠️ 错误中断 如果第一个消费者抛出异常,后续不执行
相关推荐
武子康21 分钟前
MultiNet7 每轮都 clean,ESP32-P4 内存为什么还在掉?
人工智能·后端·agent
缓慢更新33 分钟前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
超级架构师1 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
陈随易1 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
风骏时光牛马2 小时前
AI稳定性治理体系构建与疑难问题深度分析
前端
IT_陈寒2 小时前
JavaScript的this坑人实录,这次我真的记下来了
前端·人工智能·后端
starzy19903 小时前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala
开开心心就好3 小时前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
梦影_4 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
考虑考虑4 小时前
mariadb数据库
数据库·后端·mariadb