4

私がやりたいのは、実際のメソッドオブジェクトを別のメソッドに簡単に渡すことです。これは、オブジェクトのリストの特定のメソッドを結合する汎用のジョイナー関数を作成できるようにするためです。メソッドを表す文字列を渡すだけの危険はありません。これはJavaで可能であるため、次のような構文を使用できます。

joinOnMethod(String, Collections<T>, Method) e.g. 
joinOnMethod(", ", someList, T.getName())

ここで、T.getName()は、メソッド自体の戻り型を渡す代わりに、リスト内の各オブジェクトで呼び出されるgetName()メソッドを渡します。

これが私のニーズに対して十分に明確であることを願っています、

アレクセイブルー。

4

4 に答える 4

6

Javaには直接第一級関数のサポートはありません。2つのオプション:

  • メソッドの名前を渡し、リフレクションを使用して取得します
  • 次のように、単一のメンバーでタイプを作成します。

    public interface Function<In, Out> {
        Out apply(In input);
    }
    

    次に、次のように匿名の内部クラスを使用できます。

    joinOnMethod(", ", someList, new Function<T, String>() {
                     @Override public String apply(T input) {
                         return input.getName();
                     }
                 });
    

    もちろん、その関数を変数として抽出できます。

    private static Function<T, String> NAME_EXTRACTOR = 
        new Function<T, String>() {
            @Override public String apply(T input) {
                return input.getName();
            }
        };
    
    ...
    
    joinOnMethod(", ", someList, NAME_EXTRACTOR);
    
于 2012-05-18T13:38:21.273 に答える
1

Javaでコマンドパターンを調べることをお勧めします。コールバック機能をサポートしています。

http://en.wikipedia.org/wiki/Command_pattern#Java

于 2012-05-18T13:37:16.140 に答える
1

Javascriptまたは関数をオブジェクトとして扱う他の言語からJavaに移行したばかりだと思います。私の知る限り、Javaは関数をオブジェクトとして扱わないため、これは不可能です。for実際にループまたはその他の構成で書き出す必要があります。

于 2012-05-18T13:38:18.177 に答える
1

いいえ、そのような構文はありません。さらに、型消去のため、実際の型Tは実行時に使用できないため、構文が使用可能であっても、ジェネリック内では使用できません。

Class<T>秘訣は、他のパラメーターと一緒に渡し、リフレクションを使用してメソッドを取得することです。

joinOnMethod(String separator, Collections<T> items, String methodName, Class<T> theClass)

これで、クラスにメソッドを照会し、methodNameそのメソッドを計算に使用できます。これは、文字列の受け渡しから逃れるのに役立ちません(つまり、メソッドが存在しない場合にコンパイラーはエラーをトリガーしません)が、型消去にもかかわらずジェネリックスで動作させることができます。

于 2012-05-18T13:38:40.527 に答える