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
,用于:
- 保存一条消息到数据库(模拟用
System.out.println("保存:"+msg)
); - 然后发送通知(模拟用
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() 默认方法 |
支持消费者链式组合 |
✅ 顺序执行 | 前者先执行,后者后执行 |
⚠️ 错误中断 | 如果第一个消费者抛出异常,后续不执行 |