Consumer接口用于执行无返回值的副作用操作,其accept(T t)方法只接收一个参数、不返回结果,支持andThen()链式调用,适用于打印、修改状态等场景,不可用于数据转换。

Consumer 接口用于“消费”数据,即接收一个输入参数、执行操作,但不返回任何结果(返回类型为 void)。它适合做副作用操作,比如打印、修改对象状态、存入集合、写日志等。
核心特征:只进不出
Consumer 的函数签名是:void accept(T t)。它明确拒绝返回值——不能用它来转换或生成新数据。如果需要返回结果,应选 Function 或 Supplier 等其他接口。
- 只能传入一个参数(泛型
T);若需多个输入,可用BiConsumer<T, U> - 方法名固定为
accept(),不是apply()或get() - 可使用
andThen()串联合并多个 Consumer,形成执行链
常见用法示例
处理集合元素时最直观:
- 打印每个字符串:
list.forEach(System.out::println)(forEach参数就是 Consumer) - 批量设置对象属性:
users.forEach(u -> u.setActive(true)) - 收集日志信息:
Consumer<String> logger = msg -> System.err.println("[LOG] " + msg); logger.accept("User login failed");
组合多个操作:andThen
利用 andThen() 可把多个 Consumer 顺序串联,前一个的输出(虽无返回值)不影响后一个的执行:
立即学习“Java免费学习笔记(深入)”;
Consumer<String> print = s -> System.out.print(s);Consumer<String> newline = s -> System.out.println();Consumer<String> printLine = print.andThen(newline);printLine.accept("Hello"); // 输出 "Hello" 并换行
注意:别误用为数据转换
下面写法是典型误区:
- ❌
Consumer<Integer> doubleIt = x -> x * 2;(没副作用,且无法获取结果) - ✅ 正确做法:改用
Function<Integer, Integer> doubleIt = x -> x * 2; - ⚠️ 即使写成
x -> System.out.println(x * 2),也只是打印结果,原始数据未被改变,也不产出新值
Consumer 的价值在于清晰表达“我只处理这个值,不产生新东西”,让代码意图更安全、更易读。


















