Collector
有三个泛型类型:
public interface Collector<T, A, R>
A
是可变累加类型的缩写(通常作为实现细节而隐藏)。
如果我想创建自定义收集器,我需要创建两个类:
- 一个是自定义累加类型
- 一个是自定义收集器本身
是否有任何库函数/技巧可以使用积累类型并提供相应的收集器?
简单例子
这个例子非常简单,仅用于说明问题,我知道我可以在这种情况下使用reduce
方法,但这不是我要找的。这里有一个更复杂的例子,分享它会使问题变得太长,但是它是相同的思路。
假设我想将流的总和收集并返回为String
。
我可以实现我的累加器类:
public static class SumCollector {
Integer value;
public SumCollector(Integer value) {
this.value = value;
}
public static SumCollector supply() {
return new SumCollector(0);
}
public void accumulate(Integer next) {
value += next;
}
public SumCollector combine(SumCollector other) {
return new SumCollector(value + other.value);
}
public String finish(){
return Integer.toString(value);
}
}
然后我可以从这个类创建一个Collector
:
Collector.of(SumCollector::supply, SumCollector::accumulate, SumCollector::combine, SumCollector::finish);
但是对我来说,他们所有的引用都指向另一个类,我感觉有一种更直接的方法可以做到这一点。
如果我想只保留一个类,我可以使用implements Collector<Integer, SumCollector, String>
,但然后每个函数都会重复(supplier()
将返回SumCollector::supply
等)。
implements Collector<Integer, SumCollector.Acc, String>
,我会得到SumCollector.Acc'在'SumCollector'中具有私有访问权限
的错误。 - Ricola