5

我在 Joel On Software 上阅读了一篇关于使用高阶函数通过使用 map 和 reduce 来大大简化代码的想法。他提到这在 Java 中很难做到。文章:http ://www.joelonsoftware.com/items/2006/08/01.html

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

function map(fn, a)
{
    for (i = 0; i < a.length; i++)
    {
        a[i] = fn(a[i]);
    }
}

这将在实践中类似于以下调用:

map( function(x){return x*2;}, a );
map( alert, a );

理想情况下,我想编写一个映射函数来处理数组或任何类型的集合(如果可能)。

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

我想如果这在 Java 中是不可能的,那么人们使用某种“模式”/技术来实现相同的效果,因为我认为匿名函数是软件世界中一个非常强大的工具。我能找到的唯一类似的问题是:Java generics - implementation high order functions like map这对我来说绝对没有意义。

4

5 回答 5

5

Guava提供 map (但它被称为transform,并且在实用程序类中,如Listsand Collections2)。但是,它不提供折叠/减少。

无论如何,与在 Schemetransform中使用相比,使用的语法感觉非常笨拙。map这有点像用左手写字,如果你是右手的话。但是,这是 Java;你能指望什么。:-P

于 2011-04-26T06:59:02.320 回答
2

看起来像这个?

如何在 Java 中编写匿名函数?

PS:尝试函数式 Java。也许它可以给你提示。

于 2011-04-26T06:54:01.850 回答
2

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

Iterable<Source> foos = ...;
Iterable<Destination> mappedFoos = foos.map(new Function<Source, Destination>() 
{
    public Destination apply(Source item) { return ... }
});

有关具有函数式样式的 Java 库的示例,请参阅Guava

于 2011-04-26T06:57:59.233 回答
1
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;
}
于 2011-04-26T07:06:09.660 回答
0

Paguro 有一个高阶函数的开源实现。初始测试表明它比原生 Java forEach 循环快 98%。它支持的操作是惰性应用的,无需修改底层集合。它输出到不可变(有时是可变的)Clojure 集合的类型安全版本。 Transformable 内置于 Paguro 的不可修改和不可变的集合和接口中。要将原始 java.util 集合用作输入,只需将其与xform()函数包装即可。

于 2014-02-19T16:58:21.693 回答