如何在java中编写像map或reduce这样的高阶函数?

如何在java中编写像map或reduce这样的高阶函数?,java,functional-programming,higher-order-functions,Java,Functional Programming,Higher Order Functions,我读了一篇关于Joel on软件的文章,内容是关于使用高阶函数通过使用map和reduce来大大简化代码的想法。他提到在Java中很难做到这一点。该条: 下面文章中的示例在数组中循环,并使用函数fn作为数组中每个元素的参数传递: function map(fn, a) { for (i = 0; i < a.length; i++) { a[i] = fn(a[i]); } } 理想情况下,我希望编写一个映射函数来处理数组或任何类型的集合(如果可能

我读了一篇关于Joel on软件的文章,内容是关于使用高阶函数通过使用map和reduce来大大简化代码的想法。他提到在Java中很难做到这一点。该条:

下面文章中的示例在数组中循环,并使用函数fn作为数组中每个元素的参数传递:

function map(fn, a)
{
    for (i = 0; i < a.length; i++)
    {
        a[i] = fn(a[i]);
    }
}
理想情况下,我希望编写一个映射函数来处理数组或任何类型的集合(如果可能的话)

我一直在互联网上四处寻找,我很难找到关于这个主题的资源。首先,java中是否可以使用匿名函数?这是否可以用另一种方式实现?它将在java的未来版本中提供吗?如果可能的话,我怎么做

我想象如果这在Java中是不可能的,那么人们会使用某种“模式”或技术来实现同样的效果,因为我想象匿名函数在软件世界中是一种非常强大的工具。我能找到的唯一类似的问题是:这对我来说毫无意义

看起来像这个吗


附言:试试看。也许它可以给你一些提示。

单方法匿名类提供了一种类似但更详细的Java匿名函数编写方法。 例如,您可以:

Iterable<Source> foos = ...;
Iterable<Destination> mappedFoos = foos.map(new Function<Source, Destination>() 
{
    public Destination apply(Source item) { return ... }
});
Iterable foos=。。。;
Iterable mappedFoos=foos.map(新函数()
{
公共目标应用(源项){return…}
});
有关具有函数式样式的Java库的示例,请参见提供映射(但它被称为
transform
,位于
列表和
集合2
等实用程序类中)。但是,它不提供折叠/缩小功能

无论如何,与Scheme中使用
map
相比,使用
transform
的语法感觉非常笨拙。如果你是右撇子,这有点像用左手写字。但是,这是Java;你期待什么-P

接口函数{
interface Func<V,A> {
    V call (A a);
}

static <V,A> List<V> map (Func<V,A> func, List<A> as) {
    List<V> vs = new ArrayList<V>(as.size());
    for (A a : as) {
        Vs.add(func.call(a));
    }
    return vs;
}
V呼叫(A); } 静态列表映射(Func Func,列表为){ List vs=newarraylist(as.size()); 对于(A:as){ Vs.add(函数调用(a)); } 回报vs; }
。初步测试表明,它的速度比本机JavaForeach循环快98%。它所支持的操作在不修改基础集合的情况下被延迟应用。它输出不可变(有时可变)Clojure集合的类型安全版本。要使用原始java.util集合作为输入,只需使用
xform()
函数包装它

事实上,如果Java最终获得lambda表达式,它们将转换为这样一个匿名类。
interface Func<V,A> {
    V call (A a);
}

static <V,A> List<V> map (Func<V,A> func, List<A> as) {
    List<V> vs = new ArrayList<V>(as.size());
    for (A a : as) {
        Vs.add(func.call(a));
    }
    return vs;
}