前言
本文章帮助大家对BiConsumer
接口的理解。
一、概述
BiConsumer
意为二元消费者。顾名思义,它对传入参数进行处理(“消费”),一般为带副作用的处理。它是Consumer
接口的两个参数的一个“特例化”。参考Consumer
接口。
它是一个函数式接口,它可作为一个两个个参数的无结果lambda
表达式的接口类型。
二、源码理解
包
package java.util.function;
import java.util.function.BiConsumer;
使用BiConsumer
接口时,需引入此包。
BiConsumer接口
public interface BiConsumer<T, U> { /*...*/ }
使用接口时传入泛型T
、U
,函数式的参数类型,表示要处理的参数的类型。
BiConsumer方法
accept
void accept(T t, U u);
传入参数t
、u
,进行处理,即提供函数逻辑。通常可以这样使用:
Map<String, String> map = new HashMap<>();
map.put("A", "a");
map.put("B", "b");
map.put("C", "c");
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String s, String s2) {
System.out.println(s + s2);
}
});
以下为精简写法:
Map<String, String> map = new HashMap<>();
map.put("A", "a");
map.put("B", "b");
map.put("C", "c");
map.forEach((s, s2) -> {
System.out.println(s + s2);
});
例子中程序最终打印“Aa”、“Bb”、“Cc”。参考Map
接口的default void forEach(BiConsumer<? super K, ? super V> action)
方法。
andThen
default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
Objects.requireNonNull(after);
return (l, r) -> {
accept(l, r);
after.accept(l, r);
};
}
组合此函数式和after
函数式的函数逻辑,即返回的函数式先执行此函数式处理逻辑,再执行after
函数式处理逻辑。若after
为空,则抛出NullPointerException
异常,参考Objects.requireNonNull
方法。default
关键字给出默认实现。
注意:若此函数式出现异常,则after
函数式不执行。若此方法过程中出现异常,那么这些异常会交给返回函数式的调用方处理。
总结
新人源码理解,望大家多多指点。