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ジェネリック-mapのような高階関数を実装することは私にはまったく意味がありません。

4

5 に答える 5

5

Guavaはマップを提供します(ただし、代わりに呼び出さtransformれ、やなどのユーティリティクラスにListsありますCollections2)。ただし、fold/reduceは提供されません。

いずれにせよ、Schemeでtransform使用する場合と比較して、使用するための構文は非常に扱いにくいと感じます。map右利きの場合は、左手で書くのと少し似ています。しかし、これはJavaです。何を期待しますか。:-P

于 2011-04-26T06:59:02.320 に答える
2

このように見えますか?

Javaで無名関数を作成するにはどうすればよいですか?

PS:FunctionalJavaを試してください。多分それはあなたにヒントを与えるかもしれません。

于 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 に答える