iConsumer
是 Java 函数式编程中的一个重要接口,属于 java.util.function
包。它表示一个接受两个输入参数且不返回结果的操作,通常用于执行带有副作用的操作(如修改对象、打印输出等)。
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
// 可选的默认方法:andThen()
// 组合多个 BiConsumer(按顺序执行)default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {Objects.requireNonNull(after);return (t, u) -> {accept(t, u);after.accept(t, u);};}
}
-
两个泛型参数:
T
和U
分别表示第一个和第二个输入参数的类型。 -
无返回值:方法
accept
返回void
。 -
链式调用:通过
andThen()
可以组合多个BiConsumer
操作。
使用场景
-
遍历 Map 的键值对。
-
同时处理两个集合的元素。
-
批量修改对象属性。
-
日志记录或数据校验。
示例代码
示例 1:遍历 Map 的键值对
Map<String, Integer> map = Map.of("A", 1, "B", 2, "C", 3);
// 使用 BiConsumer 打印键值对
BiConsumer<String, Integer> printEntry =
(key, value) -> System.out.println(key + " -> " + value);
map.forEach(printEntry); // 直接传递 BiConsumer
示例 2:同时处理两个集合
List<String> names = List.of("Alice", "Bob", "Charlie");
List<Integer> ages = List.of(25, 30, 35);
// 遍历两个集合,按索引一一对应
BiConsumer<String, Integer> printNameAndAge =
(name, age) -> System.out.println(name + " is " + age + " years old");
for (int i = 0; i < names.size(); i++) {
printNameAndAge.accept(names.get(i), ages.get(i));
}
示例 3:组合操作(andThen)
BiConsumer<String, Integer> logData = (key, value) -> System.out.println("Logging: " + key + " = " + value);BiConsumer<String, Integer> validateData = (key, value) -> {if (value < 0) throw new IllegalArgumentException("Invalid value: " + value);};// 先校验数据,再记录日志 BiConsumer<String, Integer> combined = validateData.andThen(logData);combined.accept("Score", 90); // 正常执行 // combined.accept("Score", -5); // 抛出异常
示例 4:修改对象属性
class Person {String name;int age;// 省略构造方法和 getter/setter }List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 30) );// 批量修改年龄 BiConsumer<Person, Integer> incrementAge = (person, increment) -> person.setAge(person.getAge() + increment);people.forEach(person -> incrementAge.accept(person, 5)); // 所有人年龄+5
与其他接口对比
接口 | 输入参数 | 返回值 | 典型用途 |
---|---|---|---|
Consumer<T> | 1 | void | 处理单个对象 |
BiConsumer<T,U> | 2 | void | 处理两个关联对象或参数 |
BiFunction<T,U,R> | 2 | R | 转换两个参数为结果 |
总结
-
核心作用:处理两个输入参数且不返回结果的操作。
-
常见场景:遍历
Map
、批量修改数据、组合校验与日志。 -
链式调用:通过
andThen()
实现多步操作。 -
与 Lambda 结合:简化代码,提升可读性。