如何在clojure中处理java变量长度参数?

qiu*_*fei 38 clojure variadic-functions clojure-java-interop

我将一个java lib包装到clojure中,但是我在处理可变长度参数时遇到了问题.说,

TestClass.aStaticFunction(Integer... intList){/*....*/}
Run Code Online (Sandbox Code Playgroud)

我怎么能在clojure中调用这个函数?

Zac*_*h L 49

由于Java varargs 实际上是数组,因此可以通过传递数组来调用Clojure中的vararg函数.

您可以将Clojure seq(可能通过使用Clojure的各种变量参数函数)转换为数组:

 (TestClass/aStaticFunction (into-array Integer [(int 1),(int 2)]))
Run Code Online (Sandbox Code Playgroud)

要么

(defn a-static-function-wrapper [& args]
  (TestClass/aStaticFunction (into-array Integer args))
Run Code Online (Sandbox Code Playgroud)

或者创建一个数组并手动设置其索引

(TestClass/aStaticFunction (doto (make-array Integer 3)
                              (aset 0 first-element)
                              (aset 1 second-element)
                              (aset 2 third-element)))
Run Code Online (Sandbox Code Playgroud)

  • `Integer / TYPE`将创建一个原始数组,这可能不是这里想要的。...怀疑您只需要`Integer`。 (2认同)

mik*_*era 7

Java变量长度参数实际上需要一个数组作为输入.

所以在Clojure中,调用应该是这样的:

(TestClass/aStaticFunction (into-array Integer some-sequence-of-integers))
Run Code Online (Sandbox Code Playgroud)


小智 5

(TestClass/aStaticFunction (to-array '(1 2 3 4 5)))
Run Code Online (Sandbox Code Playgroud)

例如

(java.util.Arrays/asList (to-array '(1 2 3 4 5)))
Run Code Online (Sandbox Code Playgroud)