根据您的描述,您可能很容易推出自己的通用产品:
public interface Reducer<A, T>
{
public A foldIn(A accum, T next);
}
然后使用策略模式:
public class Reductor<A, T>
{
private Reducer<A, T> worker;
public Reductor<A, T>(Reducer<A, T> worker)
{
this.worker = worker;
}
public A fold(A rval, Iterator<T> itr)
{
while(itr.hasNext())
{
A rval = worker.foldIn(rval, itr.next());
}
return rval;
}
}
我敢肯定有大量的语法错误,但这是重点(关于如何获取空的累加器值,您可以做出一些选择。然后在特定的迭代器上使用它,只需动态定义您的 Reducer:
Reductor r = new Reductor<A, T>(new Reducer<A, T>()
{
public A foldIn(A prev, T next)
{
A rval;
//do stuff...
return rval;
}
}
A fold = r.fold(new A(), collection.getIterator());
根据您的迭代器的工作方式,只要迭代器朝着正确的方向前进,它就可以向左折叠或向右折叠。
希望这可以帮助。