2012-05-08 7 views
6

リストを持ち、それを複数の変数ではなくクロージャーシグネチャの引数として使用できますか?その理由は、私はJavaコードからクロージャを呼び出さなければならず、Javaコードはgroovyクロージャが必要とする変数を知らないからです。Groovy - リストをクロージャー引数に拡張する

これは、例によってより効果的です。

私は 'クロージャリポジトリ'を持っているとしましょう。クロージャごとに異なる署名があるかもしれません。 EG:

closures = [ 
    closureA: { int a, String b -> 
     a.times { 
      System.err.println(b); 
     } 
    }, 
    closureB: { int a, int b, String c -> 
     (a+b).times { 
      System.err.println(c); 
     } 
    } 
] 

は、それから私は、私はこれらのクロージャを呼び出すために私のJavaコードにさらすてる方法持っている:

def tryClosureExpansion(String whichClosure, Object ... args) { 
    def c = closures[whichClosure] 
    c.call(args)  // DOESNT COMPILE ! 
} 

をそして、それは、Java私はこのように、このメソッドを呼びたい:

// these calls will happen from Java, not from Groovy 
tryClosureExpansion("closureA", 1, "Hello"); 
tryClosureExpansion("closureB", 1, 5, "Hello more"); 

上記のコンパイルされない行を参照してください。私はグルーヴィーのような何かを処理するために十分な "グルーヴィー"のように感じる。飛ぶ可能性のある代替手段はありますか?

答えて

9

はい:

c.call(*args) 

仕事を?コンピュータのatmでテストするのではありません。

+2

うまくいくはずです。また、メソッド呼び出し構文を使うだけでうまくいくはずです: 'c(* args)';しかし、あなたは 'call'メソッドを利用し、クロージャが存在しない場合に安全ナビゲーション演算子を使用することができます:' c?.call(* args) '(もちろん、これはあなたのデザインに依存します。その場合は良いアイデアかもしれません)。 – epidemian

+0

ありがとうTim、それはそれをしました。私はこれがどこに文書化されているのだろうか?私はオペレータとコレクションのページをチェックしましたが、スプレッド演算子について言及していますが、これはリスト上でアクションを指定していないので少し異なります。 @epidemian - ありがとう、私は実際にこの呼び出しの前にチェックし、例外をスローするつもりです。 –

+2

@RoyTrueloveこれは「スプレッドオペレータ」と呼ばれています。これは、COllection内の複数のエントリに何かを適用するために使用されます。この場合、リストを[複数のパラメータに]展開します(http://jroller.com/aalmiray/entry/another_gem_from_groovy) –

関連する問題