是否存在'reduce'的类型安全的Java实现?

rcr*_*ick 7 java collections reduce

我经常需要在java中运行reduce(也称为foldl/foldr,具体取决于你的上下文)来聚合Itterable的元素.

Reduce采用集合/可迭代/ etc,两个参数的函数和可选的起始值(取决于实现细节).该函数连续应用于集合的元素和先前调用的输出reduce,直到处理完所有元素,并返回最终值.

在任何常见的java api中是否存在类型安全的reduce实现?Google Collections 似乎应该有一个,但我一直无法找到它.(可能是因为我不知道它会使用什么其他名称.)

luk*_*uke 2

根据您的描述,您可能可以很容易地推出自己的通用型:

public interface Reducer<A, T>
{
    public A foldIn(A accum, T next);
}
Run Code Online (Sandbox Code Playgroud)

然后使用策略模式:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我确信存在大量语法错误,但这就是要点(关于如何获取空累加器值,您可以做出一些选择。然后要在特定迭代器上使用它,只需动态定义您的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());
Run Code Online (Sandbox Code Playgroud)

根据迭代器的工作方式,只要迭代器朝正确的方向前进,它就可以向左折叠或向右折叠。

希望这可以帮助。