簡體   English   中英

是否存在'reduce'的類型安全的Java實現?

[英]Is there a type-safe Java implementation of 'reduce'?

我經常需要在java中運行reduce(也稱為foldl / foldr,具體取決於你的上下文)來聚合Itterable的元素。

Reduce采用集合/可迭代/ etc,兩個參數的函數和可選的起始值(取決於實現細節)。 該函數連續應用於集合的元素和先前調用的輸出reduce,直到處理完所有元素,並返回最終值。

在任何常見的java api中是否存在類型安全的reduce實現? Google Collections 似乎應該有一個,但我一直無法找到它。 (可能是因為我不知道它會使用什么其他名稱。)

你可以根據你的描述很容易地推出自己的通用:

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

根據迭代器的工作原理,只要迭代器向右移動,它就可以向左折疊或向右折疊。

希望這可以幫助。

根據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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM