BiConsumer 是 Java 中接收两个参数且无返回值的函数式接口,定义于 java.util.function 包,核心方法为 accept(T t, U u),常用于 Map.forEach 等需同时处理双输入的场景。

Java 中 BiConsumer 是一个函数式接口,用于接收两个参数、不返回结果(即“消费”这两个参数)。它定义在 java.util.function 包中,常用于需要同时处理两个输入值的场景,比如遍历 Map 时对键和值做操作。
BiConsumer 接口定义与基本用法
BiConsumer<t u></t> 只有一个抽象方法:
void accept(T t, U u)
其中 T 和 U 是两个泛型类型,可以相同也可以不同。
你可以用 Lambda 表达式、方法引用或匿名内部类来实现它。最常见的是 Lambda:
BiConsumer<string integer> printer = (s, i) -> System.out.println(s + ": " + i);</string>- 调用:
printer.accept("age", 25);→ 输出age: 25
结合 Map.forEach 的典型应用
Map 的 forEach(BiConsumer super K, ? super V>) 方法是 BiConsumer 最常用的场景之一:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
Map<string integer> map = Map.of("a", 1, "b", 2);</string>map.forEach((k, v) -> System.out.println(k + " → " + v));- 等价于:
map.forEach(System.out::println);(因为System.out::println也接受两个参数并打印)
自定义 BiConsumer 实现(非 Lambda 方式)
如果你需要复用逻辑或添加状态,可以写一个类实现 BiConsumer:
立即学习“Java免费学习笔记(深入)”;
class LoggingBiConsumer<t u> implements BiConsumer<t u> {</t></t>private final String prefix;LoggingBiConsumer(String prefix) { this.prefix = prefix; }public void accept(T t, U u) { System.out.println(prefix + ": " + t + ", " + u); }}- 使用:
BiConsumer<string boolean> logger = new LoggingBiConsumer("DEBUG");</string>
注意点和常见误区
-
BiConsumer不返回值,不能用return返回结果;若需返回,应选BiFunction - 两个参数类型可相同(如
BiConsumer<string string></string>),也可不同(如BiConsumer<integer list<string>></integer>) - Lambda 参数类型通常可省略(编译器推断),但复杂泛型建议显式写出以提高可读性
- 它不是线程安全的,多线程环境下需自行同步

















