Consumer接口用于“只进不出”的数据操作,接收参数执行逻辑但不返回值,核心是accept()消费数据和andThen()链式组合多个动作。

Consumer 接口用来处理“只进不出”的数据操作——它接收一个参数,执行逻辑(比如打印、保存、修改状态),但不返回任何值。核心就两个点:用 accept() 消费数据,用 andThen() 串起多个消费动作。
基本用法:传入数据并执行操作
Consumer
- 直接写 Lambda:比如 Consumer
printer = s -> System.out.println(s); ,调用 printer.accept("Hello") 就会输出 Hello - 方法引用更简洁:比如 Consumer
printer = System.out::println; ,效果一样 - 也可以做其他无返回的操作:比如把字符串存入集合、更新某个对象字段、写日志等,只要不 return 值就行
链式消费:用 andThen 顺序执行多个动作
andThen 是 Consumer 的默认方法,用于把两个 Consumer 拼成一个,先执行自己,再执行传入的那个。
- 例如:Consumer
print = s -> System.out.print("原值: " + s);
Consumerupper = s -> System.out.println(" → 大写: " + s.toUpperCase());
Consumerchain = print.andThen(upper);
调用 chain.accept("java") 输出:原值: java → 大写: JAVA - 支持多级拼接:a.andThen(b).andThen(c) 相当于先 a、再 b、最后 c
- 注意:如果前面的 accept 抛异常,后面的不会执行
常见使用场景
Consumer 不适合做转换或判断,它的定位很明确:**让数据被用掉**。
立即学习“Java免费学习笔记(深入)”;
- 遍历集合时统一处理元素:list.forEach(System.out::println) —— forEach 参数就是 Consumer
- 配合 Stream 的 peek() 查看中间结果(调试用):stream.peek(System.out::println).map(...)
- 封装重复的副作用逻辑,比如记录耗时、打监控日志、触发回调等
- 作为方法参数,把“怎么处理数据”这个行为外置,提升灵活性和可测试性
和 Supplier、Function 的关键区别
别混用:
-
Supplier
:不收参数,只返回 T(“我来给”) -
Consumer
:只收 T,不返回(“我来用”) -
Function
:收 T,返回 R(“我来转”) -
Predicate
:收 T,返回 boolean(“我来判”)


















