consumer是java 8四大函数式接口之一,用于接收一个参数且不返回结果;通过accept(t t)接收引用类型参数,支持链式调用andthen,适用于日志、状态修改等副作用操作。

Consumer 是 Java 8 引入的四大核心函数式接口之一,专用于「接收一个参数、不返回结果」的操作,也就是常说的“消费”——只做事情,不求回报。
Consumer 怎么接收参数?
它通过唯一的抽象方法 accept(T t) 接收一个类型为 T 的参数。这个参数可以是任意引用类型(不能是基本类型,但可用包装类或专用接口如 IntConsumer)。
例如:
Consumer<string> printer = s -> System.out.println("Hello: " + s);</string>printer.accept("World"); // 输出:Hello: World
怎么执行消费逻辑?
消费逻辑写在 accept() 方法体内,可以是任意无返回值的语句:打印、修改对象状态、存入集合、触发事件等。
注意:Consumer 本身不改变参数的值(Java 是值传递),但可以调用参数对象的方法来改变其内部状态。
Consumer<list>> adder = list -> list.add("new item");</list>List<string> list = new ArrayList();</string>adder.accept(list); // list 现在包含 "new item"
常用组合与增强用法
Consumer 提供了两个默认方法,方便链式消费:
-
andThen(Consumer super T> after):先执行当前 consumer,再执行
after,返回新 Consumer - compose(Consumer super T> before) 不提供(因为 Consumer 没有返回值,无法 compose 输入)
示例:
Consumer<string> log = s -> System.out.print("LOG: " + s);</string>Consumer<string> save = s -> System.out.println(" → saved");</string>Consumer<string> pipeline = log.andThen(save);</string>pipeline.accept("user123"); // 输出:LOG: user123 → saved
实际使用中的关键点
- Consumer 适合做副作用操作(I/O、修改状态、日志等),不适合用于需要返回值的场景
- 不能直接处理基本类型;要处理
int,优先用IntConsumer,避免装箱开销 - lambda 表达式中若逻辑多,建议提取为方法引用(
System.out::println)或私有方法,提升可读性 - 在 Stream API 中常配合
forEach()使用:list.stream().forEach(System.out::println);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











