我是Java 8的新手,正在尝试了解Collectors类的工作方式。我发现Collector正在返回实现Collector接口的CollectorImpl实例。为CollectorImpl定义的构造函数如下
CollectorImpl(Supplier<A> supplier,
BiConsumer<A, T> accumulator,
BinaryOperator<A> combiner,
Function<A,R> finisher,
Set<Characteristics> characteristics) {
this.supplier = supplier;
this.accumulator = accumulator;
this.combiner = combiner;
this.finisher = finisher;
this.characteristics = characteristics;
}
Collectors类的联接方法是使用以下代码创建CollectorImpl的实例。
public static Collector<CharSequence, ?, String>
joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix) {
return new CollectorImpl<>(
() -> new StringJoiner(delimiter, prefix, suffix),
StringJoiner::add, // Not able to understand how is it a BiConsumer
StringJoiner::merge,
StringJoiner::toString,
CH_NOID);
}
我无法理解上述代码中的第二个参数。双消费者表示具有两个参数且返回类型为void的方法。但是我可以看到StringJoiner :: add方法具有一个CharSequence输入参数和StringJoiner的返回类型。
为什么代码会编译。我确定我的理解存在一定差距,但是尽管努力,但我仍然无法理解我要去哪里。
请帮助我理解这一点。