Consumer接口的accept方法用于执行无返回值的操作,接收一个参数并处理,常用于遍历集合、打印、修改状态等副作用操作,其签名是void accept(T t),不支持抛出受检异常。

Consumer 接口的 accept 方法用于执行一个无返回值的操作,传入一个参数并对其做处理。 它是 Java 8 引入的函数式接口,常用于遍历集合、简化回调逻辑或封装副作用操作(比如打印、修改对象状态、写日志等)。
accept 方法的基本用法
accept 是 Consumer 唯一的抽象方法,签名是 void accept(T t)。你需要提供一个实现了该方法的对象(通常用 lambda 或方法引用),然后调用它来处理数据。
- 直接创建匿名内部类(较少用):
Consumer<String> c = new Consumer<String>() {<br> public void accept(String s) { System.out.println(s); }<br>};<br>c.accept("hello"); - 更常用的是 lambda 表达式:
Consumer<Integer> print = x -> System.out.println(x * 2);<br>print.accept(5); // 输出 10
- 也可以用方法引用:
List<String> list = Arrays.asList("a", "b", "c");<br>list.forEach(System.out::println); // System.out::println 就是 Consumer<String>
配合集合遍历使用
最典型的场景是配合 Collection.forEach() 对每个元素执行操作,替代传统 for 循环。
-
list.forEach(item -> item.toUpperCase());—— 注意这不会修改原 list,因为 String 不可变;若想收集结果,应改用map+collect - 修改对象属性(有副作用):
Consumer<Person> setAgeTo25 = p -> p.setAge(25);<br>people.forEach(setAgeTo25);
- 组合多个操作:
Consumer<String> log = s -> System.err.println("LOG: " + s);<br>Consumer<String> save = s -> db.save(s);<br>Consumer<String> both = log.andThen(save);<br>both.accept("data"); // 先 log 再 save
注意 accept 不能抛出受检异常
accept 方法声明不支持 throws 受检异常(checked exception),所以如果操作里可能抛出 IOException、SQLException 等,必须在 lambda 内部捕获或包装成 RuntimeException。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
list.forEach(s -> Files.write(path, s.getBytes())); // 编译失败:Unhandled exception - 正确写法:
list.forEach(s -> {<br> try { Files.write(path, s.getBytes()); }<br> catch (IOException e) { throw new RuntimeException(e); }<br>});
与 Supplier、Function 的区别要点
别混淆 Consumer 和其他函数式接口:
- Consumer:输入一个参数,不返回结果(void),侧重“消费”或“执行动作”
- Supplier:不接收参数,返回一个结果(如生成随机数、创建对象)
- Function:接收一个参数,返回一个结果(如字符串转大写、数字加一)


















