Как обрабатывать аргументы переменной длины Java в clojure?

Я оборачиваю java-библиотеку в clojure, но у меня проблемы с аргументами переменной длины. Сказать,

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

Как я могу вызвать эту функцию в clojure?


person qiuxiafei    schedule 28.07.2012    source источник
comment


Ответы (3)


Поскольку переменные в Java являются фактически массивами, вы можете вызывать функции с переменными аргументами в Clojure. путем передачи массива.

Вы можете преобразовать последовательность Clojure (возможно, используя различные функции Clojure с переменными аргументами) в массив:

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

or

(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)))
person Zach L    schedule 28.07.2012
comment
Integer/TYPE создаст примитивный массив, что, вероятно, не то, что здесь нужно... подозреваю, что вам нужен только Integer. - person mikera; 28.07.2012

Аргументы переменной длины Java на самом деле требуют массив в качестве входных данных.

Итак, в Clojure вызов должен быть примерно таким:

(TestClass/aStaticFunction (into-array Integer some-sequence-of-integers))
person mikera    schedule 28.07.2012

(TestClass/aStaticFunction (to-array '(1 2 3 4 5)))

Например,

(java.util.Arrays/asList (to-array '(1 2 3 4 5)))
person jittakal    schedule 28.07.2012