Skip to main content

BiConsumer

BiConsumer<T, U> 接收两个输入参数并不返回结果的操作

BiConsumer<T, U> 是 Java 8 中另一个非常有用的函数式接口,它同样位于 java.util.function 包中。与 Consumer<T> 不同的是, BiConsumer<T, U> 接受两个参数(类型分别为 T 和 U),并且不返回任何结果。

主要用途

当你需要对两个输入参数执行某些操作但不需要返回值时,就可以使用 BiConsumer。这在遍历 Map 的键值对、处理数据库记录、日志输出等场景中非常常见。


一、接口定义


@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);

default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
Objects.requireNonNull(after);
return (t, u) -> {
accept(t, u);
after.accept(t, u);
};
}
}

二、常用方法说明

1. void accept(T t, U u)

  • 作用:执行一个操作,接受两个参数。
  • 示例:打印键值对、修改对象状态等。

2. default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after)

  • 作用:将当前 BiConsumer 执行完后,再执行 after 指定的 BiConsumer
  • 链式调用:可以串联多个操作。

三、使用示例

package com.jasper.java8.functionInterface;

import com.jasper.pojo.Person;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;

public class BiConsumerDemo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 35);
map.forEach((s, integer) -> System.out.println(s + "-" + integer));

BiConsumer<String, Integer> printName = (name, age) -> System.out.println("Name: " + name);
BiConsumer<String, Integer> printAge = (name, age) -> System.out.println("Age: " + age);
BiConsumer<String, Integer> printBoth = printName.andThen(printAge);
printBoth.accept("Tom",28);

Person p = new Person("John", 20);
BiConsumer<Person, String> setName = Person::setName;
BiConsumer<Person, Integer> setAge = Person::setAge;
setName.accept(p, "Jane");
setAge.accept(p, 25);
System.out.println(p);
}
}


四、总结对比

接口参数个数是否有返回值适用场景
Consumer<T>1对单个对象进行操作
BiConsumer<T, U>2对两个对象进行操作,如 Map Entry