consumer是java中只接收不返回的函数式接口,核心方法为accept(t)执行消费逻辑和andthen()链式组合;常用lambda与方法引用,适用于foreach、peek等场景,但需自行处理受检异常。

Java 中的 Consumer 是一个标准函数式接口,专用于“只接收、不返回”的数据处理场景——它拿一个值进来,做点事(比如打印、修改对象、存日志),但不产出新值。
核心就两条:accept() 执行动作,andThen() 串多个动作
它的泛型 T 决定了能处理什么类型的数据。关键方法只有两个:
- accept(T t):唯一抽象方法,用来真正执行消费逻辑;
- andThen(Consumer super T> after):默认方法,把当前 Consumer 和另一个拼起来,先执行自己,再执行传入的那个。
最常用的写法:Lambda 和方法引用
不用写匿名类,一行就能搞定:
- 用 Lambda:
Consumer<string> printer = s -> System.out.println("处理:" + s);</string> - 用方法引用更简洁:
Consumer<string> printer = System.out::println;</string> - 调用就是:
printer.accept("hello");→ 控制台输出 “hello”
典型使用场景
它不是用来转换或判断的,而是让数据“被用掉”。常见地方有:
- 遍历集合:
list.forEach(System.out::println)—— forEach 参数就是 Consumer; - Stream 调试:
stream.peek(System.err::println).map(...); - 封装副作用逻辑:比如更新对象字段
Consumer<user> activate = u -> u.setStatus("ACTIVE");</user>; - 作为方法参数外置行为:
processUsers(users, u -> sendEmail(u));,让调用方决定怎么“消费”用户。
链式组合多个操作
比如既要记录日志,又要保存到数据库:
Consumer<string> log = s -> System.err.println("[LOG] " + s);</string>Consumer<string> save = s -> db.insert(s);</string>Consumer<string> both = log.andThen(save);</string>-
both.accept("order-123");→ 先打日志,再入库
支持多级拼接:a.andThen(b).andThen(c),顺序执行 a → b → c。注意:前面出异常,后面就不跑了。
要注意的坑
accept 方法声明是 void accept(T t),不支持抛受检异常(比如 IOException)。如果操作里可能出这类异常,必须在 lambda 里自己 try-catch 或包装成 RuntimeException:
- ❌ 错误:
list.forEach(s -> Files.write(path, s.getBytes()));(编译不过) - ✅ 正确:
list.forEach(s -> { try { Files.write(path, s.getBytes()); } catch (IOException e) { throw new RuntimeException(e); } });
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











