consumer是java 8函数式接口,接收单参数、无返回值,用于执行副作用操作;支持accept()直接消费及andthen链式组合,但后续consumer仍作用于原始输入而非中间结果。

Consumer 是 Java 8 引入的函数式接口,用于接收一个参数、不返回结果(即 void),核心作用是“消费”数据。它本身不产生新值,但通过 andThen 方法支持链式处理,适合对同一数据执行多个副作用操作(如日志、校验、修改状态等)。
单一数据的消费:直接使用 accept()
最基础用法是传入一个对象,执行某项操作。例如打印、更新字段、写入日志等:
- 使用 Lambda 表达式:
Consumer<string> printer = s -> System.out.println("收到:" + s);</string> - 调用
accept()执行消费:printer.accept("Hello"); // 输出:收到:Hello - 也可用方法引用:
Consumer<string> logger = System.out::println;</string>
链式处理:用 andThen 组合多个 Consumer
andThen 返回一个新的 Consumer,先执行当前操作,再执行传入的 Consumer。注意:链式顺序由调用顺序决定,不是声明顺序。
- 定义两个 Consumer:
Consumer<integer> doubleIt = x -> System.out.print(x * 2 + " ");</integer>Consumer<integer> squareIt = x -> System.out.print(x * x + " ");</integer> - 组合并执行:
doubleIt.andThen(squareIt).accept(3);
输出:6 9(先 double 得 6,再对原始值 3 平方得 9) - 关键点:andThen 的第二个 Consumer 接收的是原始输入参数,不是前一个 Consumer 的“输出”(因为 Consumer 不返回值)。若需真正传递中间结果,应改用
Function。
实际场景中的典型用法
Consumer 常用于需要“只做不返”的流程,比如初始化、校验、记录或清理:
-
批量处理 + 日志:
List<string> names = Arrays.asList("Alice", "Bob");<br> names.forEach(name -> { System.out.println("开始处理:" + name); process(name); });</string>
可封装为:Consumer<string> logAndProcess = name -> { System.out.println("处理中:" + name); process(name); };</string> -
组合校验逻辑:
Consumer<user> checkNotNull = u -> { if (u == null) throw new IllegalArgumentException(); };<br> Consumer<user> checkAge = u -> { if (u.getAge() checkNotNull.andThen(checkAge).accept(user);</user></user> - 避免重复代码:将通用清理动作(如关闭资源、重置标志位)封装成 Consumer,再与其他业务 Consumer 链接。
注意事项与常见误区
Consumer 的设计意图明确:只消费、不转换、不返回。误用会导致逻辑混乱:
- 不要试图从 Consumer 获取返回值——它没有 return,编译会报错;需转换请用
Function<t r></t>或Supplier<r></r>。 -
andThen不改变原 Consumer,而是生成新实例,适合构建可复用的处理流水线。 - 链式调用中若某个 Consumer 抛出异常,后续 Consumer 不会执行(除非手动捕获)。
- 多线程环境下注意 Consumer 内部操作是否线程安全,接口本身不提供同步保障。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











