【发布时间】:2016-08-24 01:21:10
【问题描述】:
我们知道 Java 8 引入了新的 Stream API,java.util.stream.Collector 是定义如何聚合/收集数据流的接口。
但是,收集器界面是这样设计的:
public interface Collector<T, A, R> {
Supplier<A> supplier();
BiConsumer<A, T> accumulator();
BinaryOperator<A> combiner();
Function<A, R> finisher();
}
为什么不是这样设计的?
public interface Collector<T, A, R> {
A supply();
void accumulate(A accumulator, T value);
A combine(A left, A right);
R finish(A accumulator);
}
后一个更容易实现。把它设计成前者是出于什么考虑?
【问题讨论】:
-
都是关于OOP和结构一致的,只是简单的猜测。
-
注意,你可以实现一个抽象基类来适应第二种模式。
-
@Thilo 我认为第一种和第二种模式都可以在各个方向上进行调整。我只是觉得第二个更直观。
-
much easier to implement不是真的。不是让你的函数在supply中,而是返回一个调用该函数的 lambda,仅此而已。
标签: java java-8 java-stream collectors