あなたの説明に基づいて、おそらくあなた自身のジェネリックをかなり簡単に転がすことができます:
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());
イテレータがどのように機能するかに応じて、イテレータが右方向に進む限り、左または右に折りたたむことができます。
お役に立てれば。