web-dev-qa-db-ja.com

clojureでJava可変長引数を処理する方法は?

Java libをclojureにラップしていますが、可変長引数の処理に問題があります。たとえば、

TestClass.aStaticFunction(Integer... intList){/*....*/}

Clojureでこの関数を呼び出すにはどうすればよいですか?

40
qiuxiafei

Java varargsは 実際には配列 なので、配列を渡すことでClojureでvararg関数を呼び出すことができます。

Clojure seqを(Clojureのさまざまな可変引数関数を使用して)配列に変換できます。

 (TestClass/aStaticFunction (into-array Integer [(int 1),(int 2)]))

または

(defn a-static-function-wrapper [& args]
  (TestClass/aStaticFunction (into-array Integer args))

または、配列を作成してそのインデックスを手動で設定します

(TestClass/aStaticFunction (doto (make-array Integer 3)
                              (aset 0 first-element)
                              (aset 1 second-element)
                              (aset 2 third-element)))
51
Zach L

Java可変長引数は、実際には入力として配列を必要とします。

したがって、Clojureでは、呼び出しは次のようになります。

(TestClass/aStaticFunction (into-array Integer some-sequence-of-integers))
8
mikera
(TestClass/aStaticFunction (to-array '(1 2 3 4 5)))

例:.

(Java.util.Arrays/asList (to-array '(1 2 3 4 5)))
5
jittakal