문제

나는 종종 itterable의 집계 요소를 집계하기 위해 Java에서 READLL / FILLR이라고도 함 (컨텍스트에 따라 컨텍스트에 따라도)를 실행해야합니다.

감소는 컬렉션/반복 가능한/등, 두 매개 변수의 함수 및 선택적 시작 값 (구현 세부 사항에 따라 다름)을 가져옵니다. 함수는 컬렉션의 요소와 모든 요소가 처리 될 때까지 이전의 감소 호출의 출력에 연속적으로 적용되며 최종 값을 반환합니다.

공통 Java API에서 감소의 유형 안전 구현이 있습니까? Google 컬렉션 보인다 하나가 있어야하지만 찾을 수 없었습니다. (아마도 다른 이름을 어떻게 사용할 것인지 모르기 때문일 수 있습니다.)

도움이 되었습니까?

해결책

설명을 바탕으로 자신의 일반적인 일반적인 것을 쉽게 굴릴 수 있습니다.

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;
    }
}

나는 구문 오류가 많다고 확신하지만 그것이 요점입니다 (빈 축적자 값을 얻는 방법에 대한 몇 가지 선택이 있습니다. 그런 다음 특정 반복기에서 사용하려면 experer를 즉시 정의합니다.

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());

반복자의 작동 방식에 따라 반복자가 올바른 방향으로 이동하는 한 왼쪽을 접거나 접을 수 있습니다.

도움이 되었기를 바랍니다.

다른 팁

Luke의 제안을 바탕으로 여기에 합법적 인 Java 구현이 있습니다.

public interface Reducer<A,T>
{
    A foldIn(A accum, T next);
}

public static <T> T reduce(final Reducer<T,T> reducer, 
        final Iterable<? extends T> i)
{
    T result = null;
    final Iterator<? extends T> iter = i.iterator();
    if (iter.hasNext())
    {
        result = iter.next();
        while (iter.hasNext())
        {
            result = reducer.foldIn(result, iter.next());
        }
    }
    return result;
}

public static <A,T> A reduce(final Reducer<A,T> reducer, 
        final Iterable<? extends T> i, 
        final A initializer)
{
    A result = initializer;
    final Iterator<? extends T> iter = i.iterator();
    while (iter.hasNext())
    {
        result = reducer.foldIn(result, iter.next());
    }
    return result;
}

시도해보십시오 Commons Functor 패키지. 그것은 영원히 샌드 박스에 있었지만, 당신이 원하는 것을 할 것이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top