Вы, вероятно, можете довольно легко свернуть свой собственный дженерик, основываясь на вашем описании:
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());
в зависимости от того, как работает ваш итератор, он может складываться влево или вправо, если итератор движется в правильном направлении.
надеюсь, это поможет.